我最初在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方法时它不起作用。
答案 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或类似的东西。