在我的Android应用中,我有一个
扩展SQLIteOpenHelper的SQLiteHelper类,负责表创建和升级等工作。
对SQLiteHelper对象执行CRUD操作的SQLiteDatasource类。
我想用某些项目预加载其中一个表格,以便在用户首次使用该应用程序时存在某些内容。这些项目可能会改变,所以我想让它们模块化。
现在我这样做:
public class MyDefaults {
public static final ArrayList<HashMap<String, String>> MY_DEFAULTS;
static {
MY_DEFAULTS = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map = new HashMap<String, String>();
//All the values below you change to whatever defaults you want
map.clear();
map.put(SQLiteHelper.KEY_1, "Value 1A");
map.put(SQLiteHelper.KEY_2, "Value 2A");
map.put(SQLiteHelper.KEY_3, "Value 3A");
MY_DEFAULTS.add(new HashMap<String, String>(map));
map.clear();
map.put(SQLiteHelper.KEY_1, "Value 1B");
map.put(SQLiteHelper.KEY_2, "Value 2B");
map.put(SQLiteHelper.KEY_3, "Value 3B");
MY_DEFAULTS.add(new HashMap<String, String>(map));
map.clear();
map.put(SQLiteHelper.KEY_1, "Value 1C");
map.put(SQLiteHelper.KEY_2, "Value 2C");
map.put(SQLiteHelper.KEY_3, "Value 3C");
MY_DEFAULTS.add(new HashMap<String, String>(map));
//and so on
}
}
然后在我的SQLiteDatasource类中,我有一个执行这些默认值插入的方法:
public void preloadDefaults() {
mDatabase.beginTransaction();
try {
for (HashMap<String, String> map : MyDefaults.MY_DEFAULTS) {
ContentValues values = new ContentValues();
values.put(SQLiteHelper.KEY_1, map.get(SQLiteHelper.KEY_1));
values.put(SQLiteHelper.KEY_2, map.get(SQLiteHelper.KEY_2));
values.put(SQLiteHelper.KEY_3, map.get(SQLiteHelper.KEY_3));
mDatabase.insert(SQLiteHelper.SOME_TABLE, null, values);
}
}
finally {
mDatabase.endTransaction();
}
}
我这样做的方式是不好的做法?有没有更好的方法来定义在创建后插入表中的“默认值”?可能通过XML而不是静态类?
注意:我不能只复制外部数据库,因为我实际上是在运行时创建了一些其他值来插入这些字段(上面的代码简化了我的实际代码)。
答案 0 :(得分:1)
同样在this回答 SQLiteAssetHelper库使这个任务变得非常简单。
很容易添加为gradle依赖项(但是一个Jar也可用于Ant / Eclipse),并且可以在以下文档中找到它: https://github.com/jgilfelt/android-sqlite-asset-helper
如文档中所述:
将依赖项添加到模块的gradle构建文件中:
dependencies {
compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}
将数据库复制到assets目录中,名为assets/databases
的子目录中。例如:
assets/databases/my_database.db
(或者,您可以使用assets/databases/my_database.zip
等压缩文件压缩数据库。这不是必需的,因为APK已经整体压缩了。)
创建一个类,例如:
public class MyDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "my_database.db";
private static final int DATABASE_VERSION = 1;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
答案 1 :(得分:0)
您可以使用序列化对象记忆您的数据。在这里阅读:
How do I serialize an object and save it to a file in Android?