Android:SQLite无法update/insert/delete数据(数据库被locked)

//在频繁范围数据库进行读写操作后,会发生增删改数据都无效的问题,查询一般正常。
						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不影响),检查锁定状态。

每次操作数据库,按下面较完整的操作进行

private static String Lock = "dblock";


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();
			}
		}
	}

	private static SQLiteDatabase getDatabase()
	{
		while (mDatabase.isDbLockedByCurrentThread()
				|| mDatabase.isDbLockedByOtherThreads())
		{
			// Log.v(TAG,"getDatabase locked.");
			// db is locked, keep looping
		}
		return mDatabase;
	}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值