Android 是否有更好的方法将项目预加载到数据库中?
在我的Android应用程序中,我有一个Android 是否有更好的方法将项目预加载到数据库中?,android,sqlite,hashmap,android-sqlite,Android,Sqlite,Hashmap,Android Sqlite,在我的Android应用程序中,我有一个 SQLiteHelper类,该类扩展SQLIteOpenHelper,并负责表的创建和升级 对SQLiteHelper对象执行CRUD操作的SQLiteDatasource类 我想用某些项目预加载其中一个表,这样当用户第一次使用应用程序时就会出现一些内容。这些项目可能会改变,所以我想使他们模块化 现在我是这样做的: public class MyDefaults { public static final ArrayList<HashMap
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
}
}
公共类MyDefaults{
公共静态最终数组列表MY_默认值;
静止的{
MY_DEFAULTS=new ArrayList();
HashMap=newHashMap();
//下面的所有值都将更改为所需的默认值
map.clear();
map.put(SQLiteHelper.KEY_1,“值1A”);
map.put(SQLiteHelper.KEY_2,“值2A”);
map.put(SQLiteHelper.KEY_3,“值3A”);
MY_DEFAULTS.add(newhashmap(map));
map.clear();
map.put(SQLiteHelper.KEY_1,“值1B”);
map.put(SQLiteHelper.KEY_2,“值2B”);
map.put(SQLiteHelper.KEY_3,“值3B”);
MY_DEFAULTS.add(newhashmap(map));
map.clear();
map.put(SQLiteHelper.KEY_1,“值1C”);
map.put(SQLiteHelper.KEY_2,“值2C”);
map.put(SQLiteHelper.KEY_3,“值3C”);
MY_DEFAULTS.add(newhashmap(map));
//等等
}
}
然后在我的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();
}
}
public-void预加载默认值(){
mDatabase.beginTransaction();
试一试{
for(HashMap映射:MyDefaults.MY_DEFAULTS){
ContentValues=新的ContentValues();
value.put(SQLiteHelper.KEY_1,map.get(SQLiteHelper.KEY_1));
value.put(SQLiteHelper.KEY_2,map.get(SQLiteHelper.KEY_2));
value.put(SQLiteHelper.KEY_3,map.get(SQLiteHelper.KEY_3));
insert(SQLiteHelper.SOME_TABLE,null,value);
}
}
最后{
mDatabase.endTransaction();
}
}
我这样做被认为是不好的做法吗?有没有更好的方法来定义创建表后插入到表中的“默认值”?可能是通过XML而不是静态类
注意:我不能只复制一个外部数据库,因为我实际上是在插入这些字段以及在运行时创建的一些其他值(上面的代码是对我的实际代码的简化)。答案也是如此
SQLiteAssetHelper库使这项任务变得非常简单
它很容易添加为gradle依赖项(但Ant/Eclipse也提供了一个Jar),与文档一起可以在:如文件中所述:
dependencies {
compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}
assets/databases
的子目录中的assets目录中。例如:assets/databases/my_database.db
(可选地,您可以将数据库压缩到zip文件中,例如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);
}
}
您可以通过序列化对象来记忆数据。请看这里:
我可能会选择CSV文件。使输入看起来尽可能像存储。@CoreyOgburn这是一个非常有趣的想法。但是,我在自动完成中没有看到任何CSV阅读器。你有什么特别推荐的方法吗?我也开始寻找,因为我可能会在我的一个项目中这样做。任何有推荐信的人都会提到,但我对此没有经验(目前)。我在我的一个项目中使用了OpenCSV,我没有任何问题。我对Android/开源的东西还不熟悉——我如何将OpenCSV整合到我的项目中?在“关于什么?”下你是什么意思?资产文件夹也会更新…:)我不确定这是否真的解决了我的核心问题——打包不是比Android中的序列化快很多吗?是的,但是打包对象有大量的样板代码,这使得类更难读取和维护