有没有更好的方法将项目预加载到数据库中?
Is there a better way to pre-load items into a database?
在我的 Android 应用程序中,我有一个
SQLiteHelper class 扩展了 SQLIteOpenHelper,并负责 table 创建和升级之类的事情。
SQLiteDatasource class 对 SQLiteHelper 对象执行 CRUD 操作。
我想用某些项目预加载 table 之一,这样当用户第一次使用该应用程序时就会出现一些东西。这些项目可能会改变,所以我想让它们模块化。
现在我是这样做的:
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 class 中,我有一个方法可以执行这些默认值的插入:
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();
}
}
我这样做的方式被认为是不好的做法吗?有没有更好的方法来定义 "defaults" 创建后插入到 table 中?可能通过 XML 而不是静态 class?
注意:我不能只复制外部数据库,因为我实际上是在插入这些字段以及在运行时创建的一些其他值(上面的代码是我的真实代码的简化)。
正如 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
(可选,您可以将数据库压缩到 zip 文件中,例如 assets/databases/my_database.zip
。不需要这样做,因为 APK 已经作为一个整体进行了压缩。)
创建一个class,例如:
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);
}
}
您可以使用序列化对象来记住您的数据。阅读此处:
How do I serialize an object and save it to a file in Android?
在我的 Android 应用程序中,我有一个
SQLiteHelper class 扩展了 SQLIteOpenHelper,并负责 table 创建和升级之类的事情。
SQLiteDatasource class 对 SQLiteHelper 对象执行 CRUD 操作。
我想用某些项目预加载 table 之一,这样当用户第一次使用该应用程序时就会出现一些东西。这些项目可能会改变,所以我想让它们模块化。
现在我是这样做的:
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 class 中,我有一个方法可以执行这些默认值的插入:
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();
}
}
我这样做的方式被认为是不好的做法吗?有没有更好的方法来定义 "defaults" 创建后插入到 table 中?可能通过 XML 而不是静态 class?
注意:我不能只复制外部数据库,因为我实际上是在插入这些字段以及在运行时创建的一些其他值(上面的代码是我的真实代码的简化)。
正如 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
(可选,您可以将数据库压缩到 zip 文件中,例如
assets/databases/my_database.zip
。不需要这样做,因为 APK 已经作为一个整体进行了压缩。)创建一个class,例如:
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); } }
您可以使用序列化对象来记住您的数据。阅读此处:
How do I serialize an object and save it to a file in Android?