我试图在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()
调用成功执行。我仍然想知道是什么导致它,但至少生产代码似乎不受其影响...
答案 0 :(得分:2)
我的app也遇到了同样的问题。 在我的应用程序中,我们有大约30-40个包,我们一起测试了每个类。 测试用例在随机给出以下错误之间失败:
测试未能完成。原因:'由于“本机崩溃”导致仪器运行失败''检查设备logcat以获取详细信息
在为您创建的所有测试类一起执行测试用例时,它是一个内存问题。
因此,只需覆盖每个测试类中的onTearDown()
方法,并通过使该测试类中使用的对象归零来释放内存。
例如:
protected void tearDown() throws Exception {
super.tearDown();
mActivity = null;
mInstance = null;
}
其中mActivity
和mInstance
是所有测试方法使用的实例变量。
这个重写tearDown()
和关联对象解决了我的问题。