【问题标题】:Is there a better way to pre-load items into a database?有没有更好的方法将项目预加载到数据库中?
【发布时间】:2016-07-17 05:20:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我可能会使用 CSV 文件。使输入看起来尽可能像存储。
  • @CoreyOgburn 这是一个非常有趣的想法。但是我在自动完成中没有看到任何 CSV 阅读器。您有什么特别推荐的方法吗?
  • 我也开始寻找,因为我可能会在我的一个项目中这样做。任何有建议的人总是提到OpenCSV,但我还没有这方面的经验。
  • 我在我的一个项目中使用了 OpenCSV,没有任何问题。
  • 我是这个 Android/开源东西的新手——我如何将 OpenCSV 整合到我的项目中?

标签: android sqlite hashmap android-sqlite


【解决方案1】:

正如this 中的回答一样 SQLiteAssetHelper 库使这项任务变得非常简单。

添加为 gradle 依赖项很容易(但 Ant/Eclipse 也可以使用 Jar),并且可以在以下位置找到它以及文档:
https://github.com/jgilfelt/android-sqlite-asset-helper

如文档中所述:

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

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

    (或者,您可以将数据库压缩成一个 zip 文件,例如 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);
        }
    }
    

【讨论】:

  • 你在“what about”下是什么意思?资产文件夹也将更新... :)
【解决方案2】:

您可以使用序列化对象记住您的数据。在这里阅读:

How do I serialize an object and save it to a file in Android?

【讨论】:

  • 我不确定这是否真的解决了我的核心问题——Parcelable 不是比 Android 中的 Serializable 快得多吗?
  • 是的,但是 Parceleable 对象有大量的样板代码,这使得类更难阅读和维护
猜你喜欢
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多