Вопрос по sqlite, android – Параллельная запись в базу данных Android (из нескольких служб)?

12

У меня серьезная проблема с базой данных andlq sqlite и одновременной записью. Для лучшего объяснения приведу пример из жизни:

У меня есть виджет рабочего стола, на котором я показываю список элементов из моей базы данных (и в фоновом режиме у меня есть DataService, который через регулярные промежутки времени собирает свежие данные с моего удаленного сервера и обновляет мою базу данных с ними). Итак, когда я нажимаю на какой-либо элемент в списке, мне нужно обновить выбранный элемент (= сделать операцию записи) в базе данных. НО, когда я нажимаю на элемент точно в момент, когда DataService обновляет свежие данные в моей базе данных, он, конечно, регистрирует ошибку, подобную этой:

android.database.sqlite.SQLiteException: error code 5: database is locked

Обычно это сложно смоделировать, но если вы планируете запуск DataService, например, каждые 10 секунд (только для демонстрации), вы можете смоделировать эту ошибку очень легко.

И мой вопрос, как справиться с этим? Я прочитал в документах, что если есть два события записи в одно и то же время, будет выполнено только первое, второе будет записано как ошибка. Звучит странно, должны быть другие варианты, например, вторая запись будет ждать до завершения первой записи. Или, может быть, другое решение? Пытаюсь читать документы, но кажется, что этот элемент не очень хорошо описан в документах Google ... Почти все, что у меня есть, я нашел на официальных страницах.

PS: Это моя сокращенная версия моего класса DBHelper:

public class DBHelper extends SQLiteOpenHelper {

    private static final String TABLE_NEWS = "News";    
    private static final String COL_ID = "id";
    private static final String COL_TITLE = "title";
    private static final String COL_ALERT = "alert";

    public DBHelper(Context context) {
        super(context, "MY_DB_NAME", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NEWS + "(" + COL_ID + " TEXT PRIMARY KEY," + COL_TITLE + " TEXT," + COL_ALERT + " INTEGER" + ")");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NEWS);
        onCreate(db);
    }

    public void addRecords(ArrayList<NewsItem> items) {
        SQLiteDatabase db = this.getWritableDatabase();    
        for (int i = 0; i < items.size(); i++) {
            NewsItem item = items.get(i);    
            ContentValues values = new ContentValues();
            values.put(COL_ID, item.getId());
            values.put(COL_TITLE, item.getTitle());
            values.put(COL_ALERT, item.getAlertMe());    
            db.insert(TABLE_NEWS, null, values);
        }    
        db.close();
    }

    public int updateRecord(NewsItem item) {
        SQLiteDatabase db = this.getWritableDatabase();    
        ContentValues values = new ContentValues();
        values.put(COL_ALERT_ME, item.getAlertMe());
        int updated = db.update(TABLE_NEWS, values, COL_ID + " = ?", new String[] { item.getId() });
        db.close();    
        return updated;
    }
}
Error: User Rate Limit Exceeded Richard
Error: User Rate Limit Exceeded qkx
Error: User Rate Limit Exceeded Simon Dorociak

Ваш Ответ

2   ответа
13

Error: User Rate Limit ExceededContentProviderError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededContentProviderError: User Rate Limit ExceededContentProviderError: User Rate Limit ExceededContentProviderError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Content providers are also useful for reading and writing data that is private to your application and not shared. For example, the Note Pad sample application uses a content provider to save notes.

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededinsert()Error: User Rate Limit Exceededmultiple threadsError: User Rate Limit Exceeded
Error: User Rate Limit ExceededContentProviderError: User Rate Limit ExceededSQLiteDatabaseError: User Rate Limit ExceededContentProvider.
Error: User Rate Limit ExceededA content provider is only required if you need to share data between multiple applicationsError: User Rate Limit Exceeded qkx
Error: User Rate Limit Exceeded qkx
22

Error: User Rate Limit ExceededSQLiteDatabaseError: User Rate Limit ExceededDBHelperError: User Rate Limit ExceededContentProviderError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded qkx

Похожие вопросы