Я использую SQLite для хранения некоторых объектов, которые затем отображаются в виде списка. Когда запускается действие, я просто беру все объекты в БД и заполняю представление списка результатами. Иногда (около 5% времени) я замечаю, что не все результаты возвращаются из БД. Я когда-либо стеснялся только одного результата, и, если я перезагружаю упражнение, пропущенный результат загружается правильно.
Пытаясь отследить проблему, я зарегистрировал пост-запрос подсчета количества объектов Cursor и заметил, что, когда результат отсутствует, он также отсутствует в объекте Cursor (поэтому проблема заключается не в раздутии возвращаемых объектов). У кого-нибудь есть опыт решения этой проблемы?
Ниже приведен пример объекта, который я храню в своей базе данных.
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. Я ценю любые предложения или советы, которые вы можете предложить. Спасибо!