2012-01-05 3 views
1

私はいくつかのオブジェクトを保存するためにSQLiteを使用しています。リストビューに表示されます。アクティビティが起動すると、db内のすべてのオブジェクトを取得し、リストビューに結果を入力します。ときどき(時間の約5%)、私はすべての結果がdbから返されたわけではないことに気付きます。私は今まで1つの結果で恥ずかしがり屋になっていました。もし私が活動をリロードすると、欠けている結果が正しくロードされます。AndroidのSQLite DBでDB内のすべてのオブジェクトが読み込まれないことがあるのはなぜですか?

問題を追跡しようとすると、クエリ後のCursorオブジェクトのカウントが記録され、結果が見つからなかった場合、Cursorオブジェクトにも欠落していたことに気付きました(問題は返されたオブジェクトを膨張させることではありません) 。誰にもこの問題の経験はありますか?

以下は、私がdbに保存しているオブジェクトの例です。私のDBからオブジェクトを読み込む例えば

public class MyObject { 
    public static final String DB_TABLE = "object"; 
    public static final int DB_VERSION = 1; 

    public static final String COL_ID = "id"; 
    public static final String COL_TITLE = "title"; 
    public static final String COL_SUBTITLE = "subtitle"; 
    public static final String COL_DESCRIPTION = "description"; 
    public static final String COL_START_TIME = "start_time"; 
    public static final String COL_END_TIME = "end_time"; 
    public static final String COL_IMAGE1 = "background_image"; 
    public static final String COL_IMAGE2 = "icon_image"; 
    public static final String COL_EXTRAS = "extras"; 

    public static final String DB_CREATE = String.format("create table if not exists %1$s (%2$s text primary key, %3$s text, %4$s text, %5$s text, %6$s integer, %7$s integer, %8$s text, %9$s text, %10$s integer);", 
     DB_TABLE, COL_ID, COL_TITLE, COL_SUBTITLE, COL_DESCRIPTION, COL_START_TIME, COL_END_TIME, COL_IMAGE1, COL_IMAGE2, COL_EXTRAS); 
    public static final String [] DB_COLUMNS = new String [] {COL_ID, COL_TITLE, COL_SUBTITLE, COL_DESCRIPTION, COL_START_TIME, COL_END_TIME, COL_IMAGE1, COL_IMAGE2, COL_EXTRAS}; 

    public String Id; 
    public String Title; 
    public String Subtitle; 
    public String Description; 
    public long StartTime; 
    public long EndTime; 
    public String Image2; 
    public String Image2; 
    public int Extras; 

    public Event() {} 

    public static DataBaseHelper getDBHelper(Context context) { 
      return new DataBaseHelper(context, QmobixConferenceApplication.DB_NAME, DB_VERSION, DB_CREATE, DB_TABLE, COL_ID); 
    } 
} 

そしてDataBaseHelperの関連チャンク...

public class DataBaseHelper extends SQLiteOpenHelper { 
    private static final String TAG = "DataBaseHelper"; 

    private SQLiteDatabase mDB; 
    private String mSQL; 
    private String mDBName; 
    private String mTableName; 
    private String mKeyId; 
    private boolean isClosed = false; 

    public DataBaseHelper(Context context, String DBName, int version, String sql, String tableName, String keyId) throws SQLiteException { 
     super(context, DBName, null, version); 
     this.mSQL = sql; 
     this.mDBName = DBName; 
     this.mTableName = tableName; 
     this.mKeyId = keyId; 
     try { 
      mDB = this.getWritableDatabase(); 
      mDB.execSQL(mSQL); 
     } catch(SQLiteException ex) { 
      Log.e(TAG, String.format("Could not create and/or open the database [ %1$s ]", mDBName), ex); 
      throw ex; 
     } 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     try { 
      db.execSQL(mSQL); 
     } catch(SQLException ex) { 
      Log.e(TAG, String.format("Could not create table according to SQL [ %1$s }", mSQL), ex); 
     } 
    } 

    @Override 
    public synchronized void close() { 
     super.close(); 
     if(mDB != null) { 
      mDB.close(); 
     } 
     isClosed = true; 
    } 

    public Cursor get(String [] columns, String orderBy) { 
     return mDB.query(mTableName, columns, null, null, null, null, orderBy); 
    } 
} 

そして今。

DataBaseHelper db = null; 
    Cursor cursor = null; 
    try { 
     db = MyObject.getDBHelper(mContext); 
     cursor = db.get(MyObject.DB_COLUMNS, String.format("%1$s ASC", MyObject.COL_START_TIME)); 
    } catch(Exception ex) { 
     // bad news 
    } finally { 
     if(cursor != null) { cursor.close(); } 
     if(db != null) { db.close(); } 
    } 

読めることはたくさんあります。誰かがこれまでにこれを見ていたらうれしいことですが、私はDataBaseHelperでちょっとしたことをやっています。私はあなたが提供できるアドバイスやアドバイスを感謝します。ありがとう!

答えて

1

下記のコードを使用してください。リストを作成中です。このリストをリストビューに追加します。

ArrayList results= new ArrayList(); 
    SQLiteDatabase myDB = this.openOrCreateDatabase("dummy.db", SQLiteDatabase.OPEN_READWRITE, null); 
     try{ 
       Cursor c = myDB.rawQuery("select a from xyz", null); 
       int Column1 = c.getColumnIndex("a"); 


      // Check if our result was valid. 
      c.moveToFirst(); 
      if (c != null) { 
       int i = 0; 
       // Loop through all Results 
       do { 
        i++; 
       String a= c.getString(Column1); 

       results.add(a); 
        } while (c.moveToNext()); 
        } 


      } catch (SQLiteException e) { 
       e.printStackTrace(); 
      } finally { 
       if (myDB != null) 
         myDB.close(); 
      } 
関連する問題