blu*_*vio 2 multithreading android android-sqlite
这是我的问题.我的应用程序启动了几个线程,每个线程都用于更新特定对象.对象的更新发生在对单个数据库的查询中.有一个数据库和一个OpenHelper.我的应用程序的行为告诉我,对数据库的调用是非同时的,也是我想要的.如何同时从不同的线程访问同一个数据库?如果每个对象的数据都在不同的表中,那么将数据库拆分到多个数据库中会更有效,每个数据库对应一个数据库?
public class SomethingToBeUpdated implements Runnable {
private SQLiteDatabase db;
@Override
public void run() {
db.rawQuery( ... bla bla
}
}
public class MainActivity extends Activity {
private SomethingToBeUpdated[] list = bla bla...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
for( SomethingToBeUpdated x : list ) {
new Thread(x).start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了在各种线程中访问数据库,您需要有一个数据库管理器,它保存数据库类的对象并将其传递给任何需要它的线程.在android中,您无法在具有不同对象的多个线程中同时访问数据库.它可能只是阻止你的UI(几天前我面临的问题).
因此,要解决此问题,您可以使用我使用的数据库管理器,其定义如下:
public class DatabaseManager {
private AtomicInteger mOpenCounter = new AtomicInteger();
private static DatabaseManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DatabaseManager();
mDatabaseHelper = helper;
}
}
public static synchronized DatabaseManager getInstance() {
if (instance == null) {
throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
public synchronized SQLiteDatabase openDatabase() {
if(mOpenCounter.incrementAndGet() == 1) {
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
public synchronized void closeDatabase() {
if(mOpenCounter.decrementAndGet() == 0) {
mDatabase.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你像这样初始化一次:
DatabaseManager.initializeInstance(new ChatSQL(c));
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下语法在任何位置获取数据库对象:
SQLiteDatabase db = DatabaseManager.getInstance().openDatabase(); //in your methods which are querying the database
Run Code Online (Sandbox Code Playgroud)
使用此方法,您的数据库现在是线程安全的.希望这可以帮助.
如果每个对象的数据都在不同的表中,那么将数据库拆分到多个数据库中会更有效,每个数据库对应一个数据库?
不,它效率不高.它有很多开销来定义,访问,创建对象和查询不同的数据库.如果你想加入桌子怎么办?你不能.
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |