我创建了一个游戏,用户可以在其中学习英语单词及其含义。每个单词都有它的翻译,知识水平,这个词有多少次出现以及其他... 所有这些数据都保存在数据库中。 这就是我想让用户选择删除游戏的所有数据(只有时间,知识杠杆和其他stuf,而不是单词和翻译)。
我尝试遍历db中的所有行并设置值(大部分为0)。 问题是大约有6000个单词,所有单词大约需要20秒。
有更快捷的方式,我可以吗?
我做的是:
public void resetData() {
Cursor c = ourDatabase.query(DATABASE_TABLE, null, null, null, null, null, null);
ContentValues cvUpdate = new ContentValues();
cvUpdate.put(KEY_TURNS, 0);
cvUpdate.put(KEY_KNOWN, 1);
cvUpdate.put(KEY_KNOWLEDGE, 0);
cvUpdate.put(KEY_SHOWN, 0);
cvUpdate.put(KEY_CURRECTANSWER, 0);
cvUpdate.put(KEY_WRONGANSWER, 0);
int i = 0;
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
i++;
StaticData.mw.wordList.get(i).resetWord();
ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "=" + i, null);
StaticData.dialog.setProgress(i);
}
}
答案 0 :(得分:1)
如果不使用explicit transactions,则每个SQL命令都会获得自己的自动事务,这是占用运行时间的事务开销。
执行许多命令时,应将它们包装到单个事务中:
db.beginTransaction();
try {
for (...)
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
但是,如果要更新具有相同值的所有行,则可以使用单个命令执行此操作:
ourDatabase.update(DATABASE_TABLE, cvUpdate, null, null);