【问题标题】:Inconsistent Android SQLite registers不一致的 Android SQLite 寄存器
【发布时间】: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。您确定您发布了确切的代码吗?

标签: android database sqlite


【解决方案1】:

问题是使用while(cursor.moveToNext()) 在遍历所有寄存器之前停止。而不是这样,迭代应该这样完成:

for(int i=0; i<cursor.getCount(); i++){
    cursor.moveToNext();
    //Do stuff with cursor info
}

【讨论】:

  • while(cursor.moveToNext())moveToNext() 返回false 时停止,这发生在最后一行之后或没有行的情况下。没有任何情况下它之前停止过。我相信问题出在循环内部或您没有发布的其他问题。
猜你喜欢
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2016-01-19
  • 2016-08-26
相关资源
最近更新 更多