Android:SQLite无法update/insert/delete数据(数据库被locked)
2016-05-12 16:10
561 查看
[java] view plain copy
//在频繁范围数据库进行读写操作后,会发生增删改数据都无效的问题,查询一般正常。
[java] view plain copy
mDatabase.beginTransaction();
try
{
Log.v(TAG,"locked:"+mDatabase.isDbLockedByCurrentThread());//true
//Log.v(TAG,"locked2:"+mDatabase.isDbLockedByOtherThreads());//false
mDatabase.execSQL(sql);
mDatabase.setTransactionSuccessful();
}
finally
{
mDatabase.endTransaction();
}
原因是数据库被锁定了。
在每次操作数据库之前(一般是增删改对数据库进行写操作时受影响,query不影响),检查锁定状态。
每次操作数据库,按下面较完整的操作进行
[java] view plain copy
private static String Lock = "dblock";
[java] view plain copy
private static void executeSQL(final String sql)
{
SQLiteDatabase db = getDatabase();//注意每次操作数据库前都要调用这个函数,以获得有效的未被锁定的db,调试时可以在这句之前加入检测是否被locked来分析问题
synchronized (Lock)
{
db.beginTransaction();
try
{
db.execSQL(sql);
db.setTransactionSuccessful();
}
finally
{
db.endTransaction();
}
}
}
[java] view plain copy
private static SQLiteDatabase getDatabase()
{
while (mDatabase.isDbLockedByCurrentThread()
|| mDatabase.isDbLockedByOtherThreads())
{
// Log.v(TAG,"getDatabase locked.");
// db is locked, keep looping
}
return mDatabase;
}
[java] view plain copy
<span style="white-space:pre"></span><pre></pre>
<pre></pre>
//在频繁范围数据库进行读写操作后,会发生增删改数据都无效的问题,查询一般正常。
[java] view plain copy
mDatabase.beginTransaction();
try
{
Log.v(TAG,"locked:"+mDatabase.isDbLockedByCurrentThread());//true
//Log.v(TAG,"locked2:"+mDatabase.isDbLockedByOtherThreads());//false
mDatabase.execSQL(sql);
mDatabase.setTransactionSuccessful();
}
finally
{
mDatabase.endTransaction();
}
原因是数据库被锁定了。
在每次操作数据库之前(一般是增删改对数据库进行写操作时受影响,query不影响),检查锁定状态。
每次操作数据库,按下面较完整的操作进行
[java] view plain copy
private static String Lock = "dblock";
[java] view plain copy
private static void executeSQL(final String sql)
{
SQLiteDatabase db = getDatabase();//注意每次操作数据库前都要调用这个函数,以获得有效的未被锁定的db,调试时可以在这句之前加入检测是否被locked来分析问题
synchronized (Lock)
{
db.beginTransaction();
try
{
db.execSQL(sql);
db.setTransactionSuccessful();
}
finally
{
db.endTransaction();
}
}
}
[java] view plain copy
private static SQLiteDatabase getDatabase()
{
while (mDatabase.isDbLockedByCurrentThread()
|| mDatabase.isDbLockedByOtherThreads())
{
// Log.v(TAG,"getDatabase locked.");
// db is locked, keep looping
}
return mDatabase;
}
[java] view plain copy
<span style="white-space:pre"></span><pre></pre>
<pre></pre>
相关文章推荐
- Android Volley框架使用源码分享
- 为Android添加开机启动脚本
- Android仿斗鱼领取鱼丸文字验证(二)
- Android开发自定义控件实现一个球赛胜负数统计条
- 通过Glide回调获取Bitmap对象并转换成Base64
- 12. Android框架和工具之 StringUtils(字符串操作)
- 【Android】 Android之API类库整理
- 11. Android框架和工具之 Logger(调试代码)
- Android 开发中遇到的Error:Execution failed for task ': :dexDebug'. > com.android.ide.common.process.Proces
- android 获取手机包名显示
- Android4.4.2 滑动事件跟踪记录
- 13.View的事件分发机制——dispatchTouchEvent详解
- android string.xml 前后加空格
- Android自定义下载状态栏
- Android中进程管理
- android studio使用svn证书错误
- Android 属性动画 详解
- Android基础--登陆界面,密码的隐藏和显示
- Android 中ListView 嵌套 ListView
- android-如何获得当前正在运行的activity的相关信息