android – SQLiteException:无法在事务中启动事务(代码1)

我在完成一个sqlite事务时遇到了问题,我对如何做到这一点感到困惑.它从2007年开始看起来像 this bug.

我正在创建我的employee表(引用另一个表实体),如下所示(为简洁起见):

CREATE TABLE employee (_id INTEGER NOT NULL,PRIMARY KEY ( _id ),FOREIGN KEY (_id) REFERENCES entity(_id)  ON DELETE cascade ON UPDATE cascade DEFERRABLE INITIALLY DEFERRED )

然后我按如下方式运行事务(使用sqliteDatabase对象,我还报告日志中事务的状态):

>> In transaction: false
beginTransaction();
>> In transaction: true
doSomeWrongINSERT();
setTransactionSuccessful();
endTransaction();
>> In transaction: false
sqliteConstraintException: foreign key constraint Failed (code 19)

好的,一切正常.现在,如果我尝试启动新事务或回滚,则两者都会失败:

>> In transaction: false
beginTransaction();
android.database.sqlite.sqliteException: cannot start a transaction within a transaction (code 1)
>> In transaction: false
endTransaction();
java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction.

请注意,如果FK立即而不是延期,则所有这些都不会发生.

解决方法

这似乎是Android中的一个错误.
SQLiteSession class中,endTransactionUnchecked在执行COMMIT之前清除其事务状态(mTransactionStack),并且不期望数据库的事务可能仍处于活动状态.
(我认为没有延迟约束就不会发生这种情况.)

提交a bug report.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...