【问题标题】:SQLite database created on Android and edited with Firefox SQlite manager在 Android 上创建并使用 Firefox SQlite 管理器编辑的 SQLite 数据库
【发布时间】:2011-11-15 22:31:08
【问题描述】:

我最初在 Windows 上创建了一个 SQLite 数据库,然后在 Android 中访问它时遇到了问题。

随后我在 Android 上创建了一个数据库,然后将其复制了出来。此时它只有 android_metadata 表。

然后我通过 CSV 导入了一些数据并将其添加回我的项目中。我项目中的 DbHelper 类将数据库复制到/data/data/my.project/databases/

现在,当我从该数据库运行原始查询时,如果我尝试访问由 CSV 导入的表,我会收到一条错误消息,指出该表不存在。如果我尝试访问我在 Android 上创建的 android_metadata 表,则没有错误。

我资产中的数据库肯定有我希望复制到 /data/data/example.project/databases 文件夹中的表,并且肯定调用了复制例程 - 我已经检查了日志输出。

现在,如果我注释掉复制代码,则会自动创建一个数据库,其中包含 android_metadata 表,大小约为 3 KB。

当复制代码生效时,数据库创建为约 8 KB。这是资产中数据库的大小,因此看来已成功复制。但是,当我将该数据库从 DDMS 拉回到我的桌面时,它大约为 8 KB,但它不包含资产文件夹中的表。如果我直接从桌面手动复制到/data/data...,那么数据库就可以工作(但这对于市场应用程序是不可能的)。

这是我复制数据库的复制代码:

public void createDatabase() throws IOException {
    Log.i(TAG, "createDatabase called");

    InputStream assetsDB = mContext.getAssets().open(DATABASE_NAME);
    OutputStream dbOut = new FileOutputStream(DATABASE_PATH);

    Log.i(TAG, DATABASE_PATH);
    Log.i(TAG, assetsDB.toString());

    byte[] buffer = new byte[1024];
    int length;
    while ((length = assetsDB.read(buffer))>0) {
        Log.i(TAG, "WritingDB block" + length);
        dbOut.write(buffer, 0, length);
    }

    dbOut.flush();
    dbOut.close();
    assetsDB.close();
}

我该如何解决这个问题?

我已经使用另一个示例纠正了这一点,该示例不使用数据库复制代码覆盖 onCreate 并自行处理数据库的复制。我真的不明白为什么调用 onCreate 方法时它不起作用。

【问题讨论】:

  • 你是如何复制的,在真实设备或模拟器中显示一些代码.....
  • 一分钟复制到模拟器。

标签: android sqlite


【解决方案1】:

如果我清楚地理解你的话,我在从其他来源加载 SQLite 数据库时遇到了同样的问题(我也使用过 Firefox SQLite 管理器)。

我想在启动时从 assets 文件夹中读取一个临时数据库,并用测试数据填充我的应用程序数据库,我通常会收到此错误。

我需要在加载我的测试数据库之前输入这段代码:

final SQLiteDatabase db = getReadableDatabase();
db.close();

我的数据库助手类:

public DataBaseHelper(Context context) {

    super(context,
          DataBaseHelper.DATABASE_NAME,
          null,
          DataBaseHelper.DATABASE_VERSION);
    this.context = context;

    // Temporary copy test database
    loadMockDataBase();

    dataBase = getWritableDatabase();
}

@Override
public final synchronized void close() {
    if (dataBase != null) {
        dataBase.close();
    }
    super.close();
}

private void loadMockDataBase() {
    final SQLiteDatabase db = getReadableDatabase();
    db.close();

    try {
        copyDataBase();
    }
    catch (final IOException e) {
        Log.d(SystemConfiguration.LOG_TAG, e.getMessage());
    }
}

【讨论】:

  • 如果我将这段代码放入其中,我会收到一条错误消息,指出我正在递归调用 getReadableDatabase。我不确定我们是否有同样的问题。
【解决方案2】:

你见过Using your own SQLite database in Android applications吗?

此页面是该主题的良好来源。但是,有一个小问题。实际上,这不是问题,并在页面中解释了如何修复。看看 cmets。

如果您的数据库有点大或小(> 1 MB,不会尝试压缩的文件。将数据库文件从 xxx 重命名为 xxx.mp3 或 xxx.txt 或类似的东西就可以了。

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多