在Android上创建并使用Firefox SQlite管理器编辑的SQLite数据库

时间:2011-09-13 07:42:01

标签: android sqlite

我最初在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,但它不包含assets表文件夹中的表。如果我直接从桌面手动复制到/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方法时它不起作用。

2 个答案:

答案 0 :(得分:0)

如果我清楚地了解你,我从其他来源加载SQLite数据库也遇到了同样的问题(我以前也常常使用Firefox SQLite manger)。

我想在启动时从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());
    }
}

答案 1 :(得分:0)

您是否见过 Using your own SQLite database in Android applications

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

如果您的数据库有点大或小(> 1 MB,<100 KB(我不确定这些值))。它似乎被压缩,导致InputStream上的Android读取混乱。诀窍是将资产重命名为打包程序尝试压缩的文件。将数据库文件从xxx重命名为xxx.mp3或xxx.txt或类似的东西。