2011-12-09 99 views
1

如果他们只对它执行查询?喜欢的东西:两个AsyncTasks可以共享相同的SQLiteDatabase对象吗?

private SQLiteDatabase db; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    db = getWritableDatabse(); 
} 

private Task1 extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... arg0) { 
     db.query(doSomething); 
     ... 
    } 
} 

private Task2 extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... arg0) { 
     db.query(doSomething); 
     ... 
    } 
} 
+1

相关http://stackoverflow.com/questions/4498664/android-multiple-databases-open http://stackoverflow.com/questions/4234030/android-can-i-use-one-sqliteopenhelper-class- for-multiple-database-files和http://stackoverflow.com/questions/1556930/sharing-sqlite-database-between-multiple-android-activities – Gray

回答

8

你的线程的所有应用程序中应该使用相同的数据库对象 - 即使同时读取和写入。 SQLite通过适当的内部锁定机制处理这个问题。

不要想做的就是使用多个数据库对象从数据库中读写。这可能会导致数据不一致。

在这里看到:

最后一条链路是一个很好的一个。引用Kevin Galligan:

  • Sqlite负责文件级锁定。许多线程可以读取,可以写入。这些锁可以防止一次以上的写作。
  • Android在SQLiteDatabase中实现了一些java锁定,以帮助保持直线。
  • 如果您发疯并从多个线程中敲击数据库,您的数据库将(或应该)不会被破坏。

以下是缺少的东西。如果您尝试同时从实际不同的连接写入数据库,则会失败。它不会等到第一个完成后才写。它不会写你的改变。更糟糕的是,如果你没有在SQLiteDatabase上调用正确版本的insert/update,你将不会得到异常。你只需要在你的LogCat中获得一条消息,就是这样。

另外,凯文已经完成了Android支持Android的Android ORP包ORMLite的一小部分工作。

+0

谢谢,我担心会发生某种“碰撞” “如果两个AsyncTask试图同时写入,但我想你的答案会清除它。 –

+0

我有类似的问题,我实际上是从两个或更多的AsyncTasks在至少有两个executionOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)..,我得到以下崩溃同时阅读“java.lang.IllegalStateException:无法执行此操作,因为连接池已关闭“。猜猜它与在每次查询之前获取可读数据库并在它关闭之后关联,以便AsyncTasks重叠,并且一个正在访问错误时刻的光标:S – Ewoks

相关问题