我目前正与一位朋友合作开发一款主要处理单词的游戏,所以 我有一个我输入数据库的单词列表。计划是在安装过程中填写个人数据库(如在每个人的手机上)。我已经完成了我在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分钟。有没有更好的方法来做这一切?
答案 0 :(得分:1)
解析文本文件的效率相当低(使用String
代替StringBuilder
;构建未使用的reverseWord
)。
然而,移动设备并不快;你将永远无法在没有延迟的情况下解析和插入350,000行。
您不应该首先在设备上构建数据库。 只需在assets文件夹中发送完整的数据库文件,然后在安装后发送copy it to your data directory。