Gleichzeitiges Schreiben in Android-Datenbank (von mehreren Diensten)?

Ich habe ein ernstes Problem mit Android SQLite-Datenbank und gleichzeitiges Schreiben. Für bessere Erklärungen gebe ich Ihnen ein reales Beispiel:

Ich habe ein Desktop-Widget, in dem eine Liste von Elementen aus meiner Datenbank angezeigt wird (und im Hintergrund habe ich DataService, der in regelmäßigen Abständen neue Daten von meinem Remote-Server sammelt und meine Datenbank damit aktualisiert). Also - wenn ich auf ein Element in der Liste klicke, muss ich das angeklickte Element (= Schreibvorgang ausführen) in der Datenbank aktualisieren. ABER wenn ich genau in dem Moment auf ein Element klicke, wenn DataService neue Daten in meiner Datenbank aktualisiert, protokolliert es natürlich einen Fehler wie diesen:

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

Normalerweise ist es schwer zu simulieren, aber wenn Sie den DataService zum Beispiel alle 10 Sekunden ausführen lassen (nur zur Demonstration), können Sie diesen Fehler sehr einfach simulieren.

Und meine Frage ist, wie damit umzugehen ist. Ich habe in der Dokumentation gelesen, dass bei zwei Schreibereignissen zur gleichen Zeit nur das erste ausgeführt und das zweite als Fehler protokolliert wird. Es hört sich seltsam an, es muss andere Optionen geben, zum Beispiel würde der zweite Schreibvorgang warten, bis der erste Schreibvorgang abgeschlossen ist. Oder vielleicht eine andere Lösung? Der Versuch, Dokumente zu lesen, aber es scheint, dass dieser Artikel in Google Docs nicht sehr gut behandelt wird ... Fast alle Informationen, die ich habe, habe ich auf anderen als offiziellen Seiten gefunden.

PS: Dies ist meine gekürzte Version meiner DBHelper-Klasse:

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;
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage