Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否有更好的方法将项目预加载到数据库中?_Android_Sqlite_Hashmap_Android Sqlite - Fatal编程技术网

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

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

  • SQLiteHelper类,该类扩展SQLIteOpenHelper,并负责表的创建和升级

  • 对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
        }
    
    }
    
    公共类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),与文档一起可以在:

    如文件中所述:

  • 将依赖项添加到模块的gradle生成文件:

    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中的序列化快很多吗?是的,但是打包对象有大量的样板代码,这使得类更难读取和维护