Android SQLiteDatabase线程安全吗?
很多人说SQLiteDatabase是线程安全的,但是,当我使用如下设置运行一些简单的测试时:Android SQLiteDatabase线程安全吗?,android,multithreading,sqlite,Android,Multithreading,Sqlite,很多人说SQLiteDatabase是线程安全的,但是,当我使用如下设置运行一些简单的测试时: private class MyRunnable implements Runnable{ @Override public void run() { for(int i = 0 ;i < 100 ; i++){ try { Thread.sleep(100); } catch (I
private class MyRunnable implements Runnable{
@Override
public void run() {
for(int i = 0 ;i < 100 ; i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Cursor cursor = database.query(true,"testdb",new String[]{"num"},"id=?",
new String[]{"1"},null,null,null,null);
cursor.moveToFirst();
int original = cursor.getInt(0);
ContentValues values = new ContentValues();
values.put("num",++original);
database.update("testdb",values,"id=?",new String[]{"1"});
}
}
}
MyRunnable runnable1 = new MyRunnable();
MyRunnable runnable2 = new MyRunnable();
new Thread(runnable1).start();
new Thread(runnable2).start();
私有类MyRunnable实现Runnable{
@凌驾
公开募捐{
对于(int i=0;i<100;i++){
试一试{
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
Cursor Cursor=database.query(true,“testdb”,新字符串[]{“num”},“id=?”,
新字符串[]{“1”},null,null,null,null);
cursor.moveToFirst();
int original=cursor.getInt(0);
ContentValues=新的ContentValues();
值。put(“num”++原始值);
update(“testdb”,值,“id=?”,新字符串[]{“1”});
}
}
}
MyRunnable runnable1=新的MyRunnable();
MyRunnable runnable2=新的MyRunnable();
新线程(runnable1.start();
新线程(runnable2.start();
在MyRunnable中,有一个循环运行100次。每次,num字段将加1,num的初始值为0。我们可以看到上面代码的预期结果是200,但我只得到197
那么这是否意味着SQLiteDatabase不是线程安全的 不,您处理数据的方式不是线程安全的。您可以使用原子SQL查询,如:
UPDATE table SET num = num + 1
与其在应用程序代码中检索数据,不如修改数据并将其存储回去
SQLite是线程安全的,这意味着您可以同时在多个线程中安全地使用所有SQLite函数,但这并不意味着数据库会根据您的操作自动锁定。如果您的线程在query()调用和update()调用之间的任何位置被中断,那么在该点返回到线程将意味着您先前检索到的数据不再是最新的。不,您处理数据的方式不是线程安全的。您可以使用原子SQL查询,如:
UPDATE table SET num = num + 1
与其在应用程序代码中检索数据,不如修改数据并将其存储回去
SQLite是线程安全的,这意味着您可以同时在多个线程中安全地使用所有SQLite函数,但这并不意味着数据库会根据您的操作自动锁定。如果您的线程在query()调用和update()调用之间的任何位置被中断,此时返回线程将意味着您先前检索到的数据不再是最新的。请提及事务。请提及事务。