gpt4 book ai didi

android - 并发写入android数据库(来自多个服务)?

转载 作者:IT王子 更新时间:2023-10-29 06:19:21 26 4
gpt4 key购买 nike

我在 android sqlite 数据库和并发写入方面遇到了严重的问题。为了更好的解释,我会给你一个真实的例子:

我有一个桌面小部件,其中显示了我数据库中的项目列表(在后台我有数据服务,它定期从我的远程服务器收集新数据,并用它们更新我的数据库)。所以 - 当我点击列表中的某些项目时,我需要更新数据库中点击的项目(=做写操作)。但是,当我恰好在瞬间单击项目时,当 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;
}
}

最佳答案

您需要在所有线程(及其托管组件)中使用单个 SQLiteDatabase 对象,以获得线程安全。使您的 DBHelper 成为单例,或使用 ContentProvider 来实现此效果。

关于android - 并发写入android数据库(来自多个服务)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com