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

并发写入android数据库(来自多个服务)?,第1张

概述我对androidsqlite数据库并发写入存在严重问题.为了更好的解释,我会给你一个真实的例子:我有一个桌面小部件,我正在显示我的数据库中的项目列表(在后台我有DataService,它定期从我的远程服务器收集新数据,并用它们更新我的数据库).所以–当我点击列表中的某个项目时,我需要更

我对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来实现此效果.

总结

以上是内存溢出为你收集整理的并发写入android数据库(来自多个服务)?全部内容,希望文章能够帮你解决并发写入android数据库(来自多个服务)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1102068.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存