Android的 - 加快插入数据库中的数据(Android - Speed up insertin

2019-07-29 13:42发布

目前,我有我解析一个CSV文件,并正尝试将数据插入到数据库中的Android。 我遇到的问题是,它正在采取的方式太长插入的所有数据。 它的数据量好,但我觉得它不应该采取20分钟左右完成。

基本上,我创建我的数据库,然后开始解析。 同时,通过每个个体CSV行分析,我抢了所需的数据,并将其插入到数据库中。 总共有大约40000行。

有没有什么办法可以加快这一进程? 我曾尝试批量插入,但它从来没有真正帮助了(除非我这样做是错误的)。

下面的代码了。

谢谢。

DatabaseHelper(I具有基于数据的每个CSV行中的量两个插入命令):

// add zipcode
    public void add9Zipcode(String zip, String city, String state, String lat,
            String longi, String decom) {

        // get db and content values
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        db.beginTransaction();
        try{

            // add the values
            values.put(KEY_ZIP, zip);
            values.put(KEY_STATE, state);
            values.put(KEY_CITY, city);
            values.put(KEY_LAT, lat);
            values.put(KEY_LONG, longi);
            values.put(KEY_DECOM, decom);

            // execute the statement
            db.insert(TABLE_NAME, null, values);

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

        db.close();

    }

    public void add12Zipcode(String zip, String city, String state, String lat,
            String longi, String decom, String tax, String pop, String wages) {

        // get db and content values
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        db.beginTransaction();
        try{
            // add the values
            values.put(KEY_ZIP, zip);
            values.put(KEY_STATE, state);
            values.put(KEY_CITY, city);
            values.put(KEY_LAT, lat);
            values.put(KEY_LONG, longi);
            values.put(KEY_DECOM, decom);
            values.put(KEY_TAX, tax);
            values.put(KEY_POP, pop);
            values.put(KEY_WAGES, wages);

            // execute the statement
            db.insert(TABLE_NAME, null, values);

            db.setTransactionSuccessful();
        } finally{
            db.endTransaction();  
        }


        db.close();
}

分析文件:

public void parse(ArrayList<String> theArray, DatabaseHandler db) {

        String[] data = null;

        // while loop to get split the data into new lines
        // for loop to split each string in the array list of zipcodes
        for (int x = 0; x < theArray.size(); x++) {

            if(x == 10000 || x == 20000 || x == 30000 || x == 40000){
                Log.d(TAG, "x is 10k, 20k, 30k, 40k");
            }

            // split string first into an array
            data = theArray.get(x).split(",");

            // separate based on the size of the array: 9 or 12
            if (data.length == 9) {

                db.add9Zipcode(data[0], data[2], data[3], data[5], data[6],
                        data[8]);

            } else if (data.length == 12) {

                db.add12Zipcode(data[0], data[2], data[3], data[5], data[6],
                        data[8], data[9], data[10], data[11]);

                /*
                 * theZip.zip = data[0]; theZip.city = data[2]; theZip.state =
                 * data[3]; theZip.lat = data[5]; theZip.longi = data[6];
                 * theZip.decom = data[8]; theZip. = data[9]; theZip.population
                 * = data[10]; theZip.wages = data[11];
                 */

            }
        }

Answer 1:

请参考这个答案我以前做: 插入在sqlite3的数据库百万行

总之,使用InsertHelper并做每笔交易超过一个插入-除非你做了什么靠不住的,速度的提升应该是明显的。

编辑:
简而言之:

  1. SQLiteOpenHelper应该是整个应用程序使用的单。
  2. 不要到处去调用close()在你的SQLiteDatabase实例-它在缓存SQLiteOpenHelper ,每次您关闭强制助手重新打开它。
  3. 批量插入你的电话到外面开始交易addZipCode方法并将其标记为成功,你已经做了之后所有的插入-然后提交事务。
  4. 使用一个InsertHelper -它会正确格式插入一个事先准备好的声明,是不错,可重复使用。
  5. 要留意的同步访问数据库的 - 除非你打算做的UI线程上的所有数据库的工作(不推荐) - 您可能需要能够锁定或保护对数据库的访问,以避免并发访问。


文章来源: Android - Speed up inserting data in database