Почему моя БД Android SQLite иногда не может загрузить все объекты в БД? - PullRequest
1 голос
/ 05 января 2012

Я использую 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. Я ценю любые предложения или советы, которые вы можете предложить. Спасибо!

1 Ответ

1 голос
/ 06 января 2012

Попробуйте использовать приведенный ниже код, здесь я создаю список, добавьте этот список в список просмотра.

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(); 
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...