【发布时间】:2020-07-29 19:03:04
【问题描述】:
我的 Android 应用上有一个本地 SQLite 数据库。为了执行一些测试,我用values.put(regValues);db.insert(register);db.close(); 做了一些插入。然后,我对数据进行了一些查询,当一切变得混乱时,我就在这里:
数据存储在本地 SQLite 数据库中。当我使用诸如SELECT * FROM TABLE 之类的一般语句查询我的 Android 应用程序上的数据时,它只检索 8 个插入的寄存器中的 2 个。这可能是一个插入错误,但事情是这样的:
在 Android 上,查询和迭代是通过以下方式完成的:
Cursor cursor = db.query(TABLE_NAME,
new String[]{TABLE_NAME.COLUMN_ID},
null,
null,
null, null, null, null);
cursor.moveToFirst();
int numberRegs = 0;
while(cursor.moveToNext()){
numberRegs++;
}
Log.d(LOG_TAG, "numberRegs: " + numberRegs);
当我使用this web debugger 检查寄存器时,我可以看到所有 8 个插入的寄存器。为了让事情更复杂一点,我尝试在我的计算机上下载数据库local,看看是否可以看到数据库中插入的 8 个寄存器,但我只看到其中的 4 个。
因此,我完全迷失了,因为我无法知道本地 SQLite 数据库的真实状态。因此,我的问题是:为什么会发生这种不一致,我可以做些什么来解决它,以便在我的 Android 查询中看到 8 个寄存器而不是当前的 2 个?
【问题讨论】:
-
当您将文件下载到您的电脑时,您是否还下载了 .db-shm 和 .db-wal 文件?
SELECT * FROM TABLE后面的行数怎么查? -
不,我不下载 shm 和 db-wal 文件,因为我看到它们只是临时文件。因此,没有这些文件,持久化的数据应该是一致的,不是吗?关于最后一部分,我已经更新了代码 sn-p 检查问题上 Android 上的行数。
-
不,它们不仅仅是临时文件。下载所有这些并将它们放在同一个文件夹中,然后打开数据库进行检查。至于您的代码,肯定会丢失第一行,因为您先执行 moveToFirst(),然后执行 moveToNext()。相反,只需执行
Log.d(LOG_TAG, "numberRegs: " + cursor.getCount()); -
好的,现在细化为:
cursor.getCount()返回 8 个寄存器(这是正确的),但是当我使用while(cursor.moveToNext())迭代时,我只得到前 2 个寄存器。因此,如何遍历寄存器以获得以cursor.getCount()出现的全部8个寄存器? -
因为它是您的代码,如果您删除
cursor.moveToFirst();,您应该会在日志中看到 8。您确定您发布了确切的代码吗?