【发布时间】: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 方法时它不起作用。
【问题讨论】:
-
你是如何复制的,在真实设备或模拟器中显示一些代码.....
-
一分钟复制到模拟器。