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

时间:2016-03-29 14:58:16

标签: android sqlite hashmap android-sqlite

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

  1. 扩展SQLIteOpenHelper的SQLiteHelper类,负责表创建和升级等工作。

  2. 对SQLiteHelper对象执行CRUD操作的SQLiteDatasource类。

  3. 我想用某些项目预加载其中一个表格,以便在用户首次使用该应用程序时存在某些内容。这些项目可能会改变,所以我想让它们模块化。

    现在我这样做:

    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而不是静态类?

    注意:我不能只复制外部数据库,因为我实际上是在运行时创建了一些其他值来插入这些字段(上面的代码简化了我的实际代码)。

2 个答案:

答案 0 :(得分:1)

同样在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

    (或者,您可以使用assets/databases/my_database.zip等压缩文件压缩数据库。这不是必需的,因为APK已经整体压缩了。)

  3. 创建一个类,例如:

    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?