由于@CommonsWare建议(在this answer的评论中)使用Android SQLiteAssetHelper库,我决定不使用Using your own SQLite database in Android applications方法(一个流行的SO答案)来复制我的从我的资产文件夹到app数据库文件夹的预填充数据库。
在Android SQLiteAssetHelper directions之后,我设置了这样的项目:
由于我使用的是gradle,我的数据库位于src/main/assets/databases/test.db.zip
。
我使用.zip
扩展程序,因为说明
此库的早期版本需要数据库资产 在ZIP存档中压缩。这不再是要求,而是 仍然受支持。仍然针对Gingerbread的应用程序(API 10) 或者应该继续提供压缩存档以确保 在打包过程中,大型数据库文件不会损坏。
我想支持早期版本的android。
我的数据库类与以下内容类似:
public class MyDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "test.db.zip";
private static final int DATABASE_VERSION = 1;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
同样,我使用了.zip
扩展名来DATABASE_NAME
值,因为说明了
...你必须在数据库文件夹中提供一个SQLite数据库 其文件名与您在代码中提供的数据库名称相匹配 (包括文件扩展名,如果有的话)
然而,当我SQLiteDatabase db = getReadableDatabase();
时,我得到一个NullPointerException。有什么问题?
这些问题和答案不是同一个问题:
答案 0 :(得分:0)
我设置问题以使答案显而易见,但现在是:
与Android SQLiteAssetHelper方向相似(在撰写本文时,无论如何。希望将来会清除它们),DATABASE_NAME
值不应包括.zip
延期。将您的代码更改为
private static final String DATABASE_NAME = "test.db"; // no .zip extension
但保持src/main/assets/databases/test.db.zip
不变,一切都应该有效。