【问题标题】:SQLite table does not exist exception for existing SQLite database (and table)现有 SQLite 数据库(和表)的 SQLite 表不存在异常
【发布时间】:2012-10-09 08:56:31
【问题描述】:

我已按照 here 的说明将现有 SQLite 数据库引入您的 Android 应用。

当我查询表“android_metadata”时,这很好。但是,当我对自己的表“words”(主整数键为 _id)运行类似查询时,我得到一个表不存在异常并且应用程序崩溃。

这是为什么呢?

代码:

Cursor c = myDatabase.query("android_metadata", null, null, null, null, null, null, null);

有效但

Cursor c = myDatabase.query("words", null, null, null, null, null, null, null);

返回表不存在异常。

这就是我创建数据库的方式(对路径和文件名的引用是正确的):

private void copyDatabase() throws IOException
{
    //Open local db as the input stream
    InputStream myInput = mContext.getAssets().open(DB_NAME);

    //Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length = 0;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

(注意:在我看来,表格就在那里。我正在我的 SQLite 浏览器中查看它。)

【问题讨论】:

  • 没有一些代码没有人能够回答......
  • 这不是编码问题 - 如果我能找到一个表而不是另一个表,那么这是如何编辑 sqlite 数据库以适应 android 的问题。我敢肯定有人遇到过这个......
  • 有关更多代码,请参阅随附的“此处”链接。这是非常标准的 SQLiteDatabase 帮助程序。
  • 您的数据库的路径是否遵循以下规则:/data/data/your.applications.package/databases Android 期望您的数据库位于该位置。 stackoverflow.com/questions/2318784/the-sqlite-database-path
  • 是的。就像我说的,我可以查询“android_metadata”表,但是当我查询自己的“words”表时,我得到了一个异常。

标签: android sqlite


【解决方案1】:

您正在关注红鲱鱼。无论如何,android_metadata 表都会在每个 android 数据库中创建。

确定问题的真正机制是简单地在模拟器中运行您的应用程序并检查数据库。如果您的模拟器正在运行并且应用程序已设置数据库,请运行:

adb shell
cd /data/data/your.application.package/databases
ls

如果ls 显示您期望的数据库名称,运行:

sqlite3 <your db file>

在 sqlite3 提示符下运行:.schema

这将打印出数据库的表。我的猜测是,您只会找到元数据表,因为 android 实际上并没有从您的外部位置读取您的数据库。如果是这种情况,请回复评论,我可以帮助您完成该过程。

【讨论】:

  • 也许这就是您说“(注意:在我看来,表格就在那里。我正在我的 SQLite 浏览器中查看它。)”时的意思,如果是这样,我'将删除此答案。这是最终的机制。
  • 你太棒了。这有助于我缩小范围。
  • 好的 - 你说的对,红鲱鱼是完全正确的。因为“android_metadata”表是默认创建的,并且因为我已经将它添加到我自己的数据库中以适应Android,所以我认为它被找到了。因此,我误以为正在调用 copyDatabase 并且已加载我的数据库文件。相反,根本没有调用 copyDatabase 并且看到这一点就解决了问题。我从一开始就自己编写代码会更好 - 给自己的教训:不要过度信任公开可用的代码,我建议不要使用我的问题中链接的代码。
  • 好。我很高兴这已解决 - 谢谢,谢谢。需要明确的是,即使我通过资产引入了自己的 SQLite 数据库文件(并且它已经包含一些数据),我也不需要自己在这个文件中创建一个名为“android_metadata”的表吗?这是多余的,因为无论如何Android都会这样做?
  • 另外,如果我错了,请纠正我,但 Android 文档并没有说默认创建了一个名为“android_metadata”的表......? (这是基于在文档中搜索字符串“android_metadata”。)在这种情况下,多么邪恶的红鲱鱼。
【解决方案2】:

您可以尝试使用 SQLiteHelpter 创建您的数据库。 它会检查一个是否存在,如果不存在,它会创建一个,而无需您付出任何额外的努力。

我已经发布了关于其他问题的示例,请在此处查看:
Android - Sqlite database method undefined fot type

希望这会有所帮助:)

【讨论】:

  • 谢谢。我的数据库是只读资产。我已经设法从新创建数据库,这是一个不同的问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
相关资源
最近更新 更多