我对android sqlite数据库和并发写入存在严重问题.为了更好的解释,我会给你一个真实的例子:
我有一个桌面小部件,我正在显示我的数据库中的项目列表(在后台我有DataService,它定期从我的远程服务器收集新数据,并用它们更新我的数据库).所以 – 当我点击列表中的某个项目时,我需要更新数据库中的点击项目(=写入操作).但是,当我完全点击项目时,当DataService正在更新我的数据库中的新数据时,它当然会记录如下错误:
android.database.sqlite.sqliteException: error code 5: database is locked
通常很难模拟,但如果你安排DataService每10秒运行一次(仅用于演示),你可以很容易地模拟这个错误.
我的问题是,如何处理这个?我在文档中读到,如果同时有两个写入事件,则只会执行第一个,第二个将被记录为错误.它听起来很奇怪,必须有另一个选项,例如第二次写入会等到第一次写完.或者其他解决方案?试图阅读文档,但似乎,这个项目在谷歌文档中不是很好…几乎我拥有的每一个信息,我在官方网页以外找到.
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来实现此效果.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。