尝试执行SQLite更新的本机崩溃

时间:2014-03-31 07:04:03

标签: android sqlite crash

我试图在SQLite表的所有行中增加整数列的值。我们假设表名为items,列名为value。代码如下所示:

SQLiteDatabase db = getDatabase();
db.execSQL("update items set value = (value + 1)");

代码在单元测试中运行,整个测试套件完全停止,并显示以下消息:

  

测试未能完成。原因:'仪表运行失败   由于本机崩溃'。检查设备logcat以获取详细信息

Here is the entire crash dump from logcat.

我已在SQLite shell中验证过上面的update语句确实按写入方式工作,并会增加列的值。我也尝试过这些变化,每次都会导致相同的崩溃:

// variation 1
String sql = "update items set value = ?";
String[] sqlArgs = new String[]{ "(value + 1)" };
db.execSQL(sql, sqlArgs); // crashes

// variation 2
SQLiteStatement statement = db.compileStatement();
statement.execute(); // crashes

// variation 3
// Near as I can tell, below is what execSql does under the hood
SQLiteStatement statement = db.compileStatement();
statement.executeUpdateDelete(); // crashes

有没有人遇到过这样的事情?如何在不崩溃的情况下执行上述更新语句?

修改

此崩溃似乎仅在Android JUnit测试中发生。在实际运行的应用程序中,上面的update语句的execSQL()调用成功执行。我仍然想知道是什么导致它,但至少生产代码似乎不受其影响...

1 个答案:

答案 0 :(得分:2)

我的app也遇到了同样的问题。 在我的应用程序中,我们有大约30-40个包,我们一起测试了每个类。 测试用例在随机给出以下错误之间失败:

测试未能完成。原因:'由于“本机崩溃”导致仪器运行失败''检查设备logcat以获取详细信息

在为您创建的所有测试类一起执行测试用例时,它是一个内存问题。 因此,只需覆盖每个测试类中的onTearDown()方法,并通过使该测试类中使用的对象归零来释放内存。

例如:

protected void tearDown() throws Exception { super.tearDown(); mActivity = null; mInstance = null; }

其中mActivitymInstance是所有测试方法使用的实例变量。

这个重写tearDown()和关联对象解决了我的问题。