我正在尝试解决我在Ankidroid中遇到的数据库问题。执行了以下声明:
SELECT count(*) FROM cards c WHERE type = 1 AND combinedDue <
1335153600.000000
它是由there生成的。执行的代码如下(github link):
cursor = mDatabase.rawQuery(query, null);
if (!cursor.moveToNext()) {
throw new SQLException("No result for query: " + query);
}
我无法理解我怎么没有记录,我应该得到1或0.日志中的调用堆栈如下:
at com.ichi2.anki.Deck.rebuildRevCount(Deck.java:1351)
Caused by: android.database.SQLException: No result for query: ……
at com.ichi2.anki.AnkiDb.queryScalar(AnkiDb.java:129)
at com.ichi2.anki.Deck._rebuildRevCount(Deck.java:1621)
有什么想法吗?
事实上,我更关注类似案例。我们有一个“统计数据”表,其中包含一个“全球”列,其中可以有一个全球记录和许多日常记录。如果我们找不到(一个简单的选择)全局记录,我们就会创建它。在我的手机上,似乎有时没有找到全局记录,所以我们创建了一个额外的记录。 它看起来就像我上面展示的那样。
修改:
我找到了原因。在另一个线程中,AsyncTask在进行查询的同时关闭数据库(因为GUI触发的大量处理是异步完成的)。它返回一个没有记录的游标。
我通过向文件添加痕迹看到了这一点。
答案 0 :(得分:1)
尝试if (cursor.moveToFirst == false)
而不是使用!运营商。我认为你现在这样做的方式总是将你带入if的主体。并且光标没有正确初始化。没有a.moveToFirst。