-2

私のqusを落としてください。私はアンドロイドのnubeです。 私はWebサービスを呼び出す1つのアプリケーションを開発しています。結果と私はアンドロイドのSQLデータベースに格納したい。 1つのレコードが保存されていることを示していますが、そのレコードを取得しようとしたときに値が表示されませんでした。私はそれで何がうまくいかないのか理解できません。アンドロイドデータベースのアップデートが正しく動作しない

public class LyricsStore { 
    private static LyricsStore sInstance = null; 
    private MusicDB mMusicDatabase = null; 

    public LyricsStore(final Context context) { 
     mMusicDatabase = MusicDB.getInstance(context); 
    } 

    public static final synchronized LyricsStore getInstance(final Context context) { 
     if (sInstance == null) { 
      sInstance = new LyricsStore(context.getApplicationContext()); 
     } 
     return sInstance; 
    } 


    public void onCreate(final SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE IF NOT EXISTS " + LyricsColumns.NAME + " (" 
       + LyricsColumns.ID + " LONG NOT NULL," 
       + LyricsColumns.Lyrics + " STRING NOT NULL);"); 
    } 

    public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { 
    } 

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + LyricsColumns.NAME); 
     onCreate(db); 
    } 

    int result = 0; 

    public boolean AddUpdateLyrics(long SongID, String SongLyrics) { 
     final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); 
     database.beginTransaction(); 
     //onCreate(database); 
     Cursor c = getData(database, SongID); 
     if (c == null) 
      return false; 

     if (c.getCount() > 0) { 
      ContentValues contentValues = new ContentValues(); 
      //contentValues.put(LyricsColumns.ID, SongID); 
      contentValues.put(LyricsColumns.Lyrics, "this is test"); 
      result = database.update(LyricsColumns.NAME, contentValues, LyricsColumns.ID + "=?", new String[]{Long.toString(SongID)}); 
     } else { 
      ContentValues contentValues = new ContentValues(); 
      contentValues.put(LyricsColumns.ID, SongID); 
      contentValues.put(LyricsColumns.Lyrics, SongLyrics); 
      result = (int) database.insert(LyricsColumns.NAME, null, contentValues); 
     } 
     database.setTransactionSuccessful(); 
     database.endTransaction(); 
     return true; 
    } 

    public String getLyrics(long songid) { 
     String lyrics = ""; 
     Cursor res = null; 
     try { 
      SQLiteDatabase db = mMusicDatabase.getReadableDatabase(); 

      res= db.query(LyricsColumns.NAME, 
        new String[]{LyricsColumns.ID,LyricsColumns.Lyrics}, null, null, null, null, 
        LyricsColumns.ID + " DESC", "10"); 

      //res = db.rawQuery("select * from " + LyricsColumns.NAME + " where "+ LyricsColumns.ID + "=" + songid + "", null); 
      if (res == null) 
       return ""; 
      if (res.getCount() > 0) { 
       lyrics = res.getString(res.getColumnIndex(LyricsColumns.Lyrics)); 
      } 
     } catch (Exception ex) { 

     } 

     return lyrics; 
    } 

    public Cursor getData(SQLiteDatabase database, long id) { 
     Cursor res = null; 
     String error = ""; 
     try { 
      SQLiteDatabase db = mMusicDatabase.getReadableDatabase(); 
      res = database.rawQuery("select * from " + LyricsColumns.NAME + " where songid=" + id + "", null); 
     } catch (Exception ex) { 
      error = ex.getMessage(); 

     } 

     return res; 
    } 

    public interface LyricsColumns { 

     String NAME = "lyricsstore"; 

     String ID = "songid"; 

     String Lyrics = "lyrics"; 
    } 
} 
+0

MusicDBファイルを表示できますか? –

+0

私は宣言している単純なクラスですpublic void onCreate(SQLiteDatabase db){LyricsStore.getInstance(mContext).onCreate(db); –

+0

なぜSQLiteOpenHelperを拡張しなかったのですか? –

答えて

0

問題、これを試してみてください:MusicDBクラスに静的インスタンスを作成する必要はありません

MusicDbクラスのonCreate, onUpgrade and default callbackを使用してください。

カーソルから値を読み取っている間は、反復処理を行う必要があります。 LyricsStoreクラスのコードgetLyricsを確認してください。

変更されたファイル。

 
public class MusicDB extends SQLiteOpenHelper { 
    private static final String DB_NAME = "MusicDb"; 
    private static int mDbVersion = 1; 

    public MusicDB(Context context) { 
     super(context, DB_NAME, null, mDbVersion); 
     Log.v(MusicDB.class.getSimpleName(), "Called music db constructor"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE IF NOT EXISTS " + DbColumns.MusicDb.NAME + " (" 
       + DbColumns.MusicDb.ID + " LONG NOT NULL," 
       + DbColumns.MusicDb.Lyrics + " STRING NOT NULL);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + DbColumns.MusicDb.NAME); 
     onCreate(db); 
    } 
} 

LyricsStoreがDbColumnsをファイル

 
public class LyricsStore { 
    private static LyricsStore sInstance = null; 
    private MusicDB mMusicDatabase = null; 

    private LyricsStore(final Context context) { 
     mMusicDatabase = new MusicDB(context); 
    } 

    public static final synchronized LyricsStore getInstance(final Context context) { 
     if (sInstance == null) { 
      sInstance = new LyricsStore(context.getApplicationContext()); 
     } 
     return sInstance; 
    } 

    int result = 0; 

    public boolean AddUpdateLyrics(long SongID, String SongLyrics) { 
     final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); 
     database.beginTransaction(); 
     Cursor c = getData(database, SongID); 
     if (c == null) { 
      database.endTransaction(); 
      return false; 
     } 

     if (c.getCount() > 0) { 
      ContentValues contentValues = new ContentValues(); 
      contentValues.put(DbColumns.MusicDb.ID, SongID); 
      contentValues.put(DbColumns.MusicDb.Lyrics, SongLyrics); 
      result = database.update(DbColumns.MusicDb.NAME, contentValues, DbColumns.MusicDb.ID + "=?", new String[]{Long.toString(SongID)}); 
     } else { 
      ContentValues contentValues = new ContentValues(); 
      contentValues.put(DbColumns.MusicDb.ID, SongID); 
      contentValues.put(DbColumns.MusicDb.Lyrics, SongLyrics); 
      result = (int) database.insert(DbColumns.MusicDb.NAME, null, contentValues); 
     } 
     database.setTransactionSuccessful(); 
     database.endTransaction(); 
     return true; 
    } 

    public String getLyrics(long songid) { 
     String lyrics = ""; 
     Cursor res = null; 
     try { 
      SQLiteDatabase db = mMusicDatabase.getReadableDatabase(); 

      res= db.query(DbColumns.MusicDb.NAME, 
        new String[]{DbColumns.MusicDb.ID,DbColumns.MusicDb.Lyrics}, DbColumns.MusicDb.ID + "=?", new String[]{String.valueOf(songid)}, null, null, null); 
      if (res == null) 
       return ""; 
      if (res.getCount() > 0) { 
       // This is the place you made the mistake. you need to iterate and then try to get the value. 
       while (res.moveToNext()) { 
        lyrics = res.getString(res.getColumnIndex(DbColumns.MusicDb.Lyrics)); 
       } 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     return lyrics; 
    } 

    public Cursor getData(SQLiteDatabase database, long id) { 
     Cursor res = null; 
     String error = ""; 
     try { 
      res = database.query(DbColumns.MusicDb.NAME, new String[]{DbColumns.MusicDb.ID, DbColumns.MusicDb.Lyrics}, DbColumns.MusicDb.ID + "=?", new String[]{String.valueOf(id)}, null, null, null); 
     } catch (Exception ex) { 
      error = ex.getMessage(); 
     } 

     return res; 
    } 
} 

ファイルファイルMusicDb

 
public class DbColumns { 
    public abstract class MusicDb implements BaseColumns { 
     public static final String NAME = "lyricsstore"; 
     public static final String ID = "songid"; 
     public static final String Lyrics = "lyrics"; 
    } 
} 

参考のため、このprojectをgithubにチェックしてください。

+0

@mahendranありがとう、問題は私が(res.moveToNext())中に見逃していた{今、 –

0

あなたのコードで

public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS " + LyricsColumns.NAME); 
    onCreate(db); 
} 
+0

のそれを拡張していません。 –

関連する問題