Android上的数据库多线程

时间:2011-11-30 22:08:36

标签: android multithreading database-connection

我试图在Android上多线程使用一个sqlite数据库。 我有以下情况:

活动A:它有10个使用DB的线程,但只使用一个SQLiteDatabase

活动B:有10个线程使用DB,但只使用一个SQLiteDatabase

(活动的两个SQLiteDatabase对象不同)

逻辑执行如下:

  1. A致电B
  2. B插入数据库并返回A
  3. 显示结果
  4. 尝试删除B插入但失败的内容。
  5. A可以删除旧的东西,但刚插入的B的新对象失败,如果我重新启动应用程序,A能够擦除以前无法删除的对象。 我是否应该为两个活动使用相同的SQLiteDatabase,如果是这种情况如何将此对象传递给活动B?

    活动线程代码:

    私有类Delete_Task扩展了AsyncTask {

        private Context mContext;
    
        private DatabaseManager mDB;
    
        public DeleteEvent_Task(Context mContext,DatabaseManager DB) {
            this.mContext = mContext;
            this.mDB = DB;
        }
    
        @Override
        protected Void doInBackground(Long... params) {
            long id = params[0];
    
            this.mDB.delete(id);
    
            return null;
        }
    }
    

    活动B线程代码:

    私有类Update_Task扩展了AsyncTask<对象,空隙,空隙> {

        private Context mContext;
    
    
        public Update_Task(Context mContext)
        {
            this.mContext = mContext;
        }
    
        @Override
        protected Void doInBackground(Event... params) {
            Object e = params[0];
    
            DatabaseManager DB = new DatabaseManager(this.mContext);
    
            if (e.getId() <= 0)
            {           
                DB.add(e);
            }
            else
            {
    
                DB.update(e.getId(), e);
            }
            DB.close();
    
            return null;
        }       
    }
    

4 个答案:

答案 0 :(得分:3)

到目前为止,最简单的方法是在应用程序启动时打开数据库连接一次,并在整个代码中共享此连接,而不必关闭它。如果您使用单个连接,则所有读取和写入都将被正确序列化,因此您无需担心它。

答案 1 :(得分:1)

如果您使用相同的数据库并在每个执行的语句之前和之后打开和关闭数据库连接,那么它应该没有冲突

答案 2 :(得分:1)

我认为你可能更容易为每个需要它的线程初始化一个新的SQLiteDatabase而不是传递它。确保在完成后关闭它。

您是否尝试过serialized mode

答案 3 :(得分:0)

小贴士: 验证使用OO数据库的可能性Berkeley DB for Android是完整的Java实现,安全,多线程,完整的文档和免费。 您的处理优于本机,因为不执行本机访问但在dalvik vm上完成您的任务。 我已经开发了新的应用程序,我没有抱怨。