从文件SQLite Android优化大量插入的性能

时间:2014-07-22 05:42:53

标签: android database sqlite optimization

我目前正与一位朋友合作开发一款主要处理单词的游戏,所以 我有一个我输入数据库的单词列表。计划是在安装过程中填写个人数据库(如在每个人的手机上)。我已经完成了我在StackOverflow和Google上发现的所有优化,但它仍然需要很长时间,大约差不多2分钟,这对于这么简单的游戏来说是不可接受的。

wordlist本身由大约350000个单词组成,因此我们创建了一个包含的文件 相同数量的插入(这是最好的方法吗?),即每个单词在具有相应插入的文本文件中都有自己的行。这就是我目前所拥有的:

public int initializeDatabase(Context context) throws IOException {

        int result = 0; //returns querys completed
        SQLiteDatabase db = this.getWritableDatabase();
        //Opening a file for reading
        InputStream insertStream = context.getResources().getAssets().open("allWords.txt");
        BufferedReader insertReader = new BufferedReader(new InputStreamReader(insertStream));

        //Iterating through lines
        String query = "INSERT INTO words(word,tezina) VALUES(?,?)";//? entered in code
        SQLiteStatement statement = db.compileStatement(query);
        db.beginTransaction();//otvaram transakciju
        while(insertReader.ready()){
                statement.clearBindings();
                String toExtract = insertReader.readLine();//uzimam upit
                String word = "";
                int tezina = (int)toExtract.charAt(toExtract.length() - 2);//extract word difficulty
                for(int i = toExtract.length() - 4; i > 0; i--){

                    if(toExtract.charAt(i) == '(') break;
                    else word += toExtract.charAt(i);
                }//extract word along with ' ', from back to save time
                String reverseWord = "";
                for(int j = word.length() - 1; j >= 0; j--){
                    reverseWord = reverseWord + word.charAt(j);
                }//reverse it
                statement.bindString(1, word);//bind parameters
                statement.bindLong(2, tezina);
                statement.execute();
                result++;
        }
        db.setTransactionSuccessful();
        db.endTransaction();//end of transaction
        insertReader.close();
        return result;//return queries completed

    }

350262次插入,大约需要2分钟。有没有更好的方法来做这一切?

1 个答案:

答案 0 :(得分:1)

解析文本文件的效率相当低(使用String代替StringBuilder;构建未使用的reverseWord)。

然而,移动设备并不快;你将永远无法在没有延迟的情况下解析和插入350,000行。

您不应该首先在设备上构建数据库。 只需在assets文件夹中发送完整的数据库文件,然后在安装后发送copy it to your data directory