有没有更好的方法将项目预加载到数据库中?

Is there a better way to pre-load items into a database?

在我的 Android 应用程序中,我有一个

  1. SQLiteHelper class 扩展了 SQLIteOpenHelper,并负责 table 创建和升级之类的事情。

  2. 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

如文档中所述:

  1. 将依赖项添加到模块的 gradle 构建文件中:

    dependencies {
        compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
    }
    
  2. 将数据库复制到 assets 目录中名为 assets/databases 的子目录中。例如:
    assets/databases/my_database.db

    (可选,您可以将数据库压缩到 zip 文件中,例如 assets/databases/my_database.zip。不需要这样做,因为 APK 已经作为一个整体进行了压缩。)

  3. 创建一个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?