性能 SQLite 问题 - 代码更改可以加快速度吗?
我使用以下代码向数据库添加行:
public void insert(String kern, String woord) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KERN, kern);
values.put(WOORD, woord);
db.insertOrThrow(TABLE_NAME, null, values);
return;
目前,我调用此 insert() 3.455 次,以将所有单词添加到数据库,使用: insert("Fruits", "Banana");这需要永远。
我怎样才能改变这个代码以使其工作得更快?我正在考虑 foreach,但不知道如何实现..谢谢!
/编辑; @hovanessyan 提供的解决方案有效并且可以完成这项工作。并且..请注意,如果您有很多必须放入的行,您可能会遇到该方法超出最大字节限制错误。在这种情况下,请查看其他解决方案,该解决方案建议将数据库打包在实际的 .APK 文件中。
I use the following code to add rows to my database :
public void insert(String kern, String woord) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KERN, kern);
values.put(WOORD, woord);
db.insertOrThrow(TABLE_NAME, null, values);
return;
Currently, I'm invoking this insert() 3.455 times, to add all words to the database, using : insert("Fruits", "Banana")
; It takes forever.
How can I change this code to work faster? I'm thinking in the line of foreach, but don't know how to implement.. Thanks!
/Edit; The solution provided by @hovanessyan works and will do the job. AND.. note that if you have a lot of lines that have to be put in, you might be confronted with the method exceeds max byte limit error. In that case, review the other solution, that suggests packing the database in the actual .APK file.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以将这些插入打包到事务中。
You can wrap-up those inserts into transaction.
您可以使用批量插入:
You can use bulkInsert:
使用 hovanessyan 和 Damian 的技巧(提醒我在达到 15 级后立即对你进行 +1 ;),我想出了以下解决方案:
我使用 SQLite 创建了数据库数据库浏览器,并将其放入我的资产文件夹中。
然后,以下代码将数据库复制到设备(如果该设备尚不存在):
public void copyDB() throws IOException{
最终字符串 DB_DESTINATION = "/data/data/happyworx.nl.Flitswoorden/databases/WoordData.db";
在我的应用程序中,数据库的一部分是用户可自定义的。
我在 onStart() 中调用上面的代码:
因此,当用户按下“将数据库重置为标准”(在首选项屏幕中)时,我只需将布尔
initialiseDatabase
设置为“false”并等待用户返回到主要活动。 (从而调用 onstart 并复制原始数据库)。我尝试从preferences.java 调用Activity.copyDB()。它更简洁,因为它不需要用户返回主活动来重建数据库。但是,我收到有关无法调用对非静态方法的静态引用的错误。我不太明白,但会研究一下。
Using the tips of both hovanessyan and Damian (remind me to rep+1 you as soon as I reach 15 ;), I came up with the following solution:
I created the database using SQLite Database Browser, and put it in my Assets folder.
Then, the following code copies the database to the device, if it's not already there:
public void copyDB() throws IOException{
final String DB_DESTINATION = "/data/data/happyworx.nl.Flitswoorden/databases/WoordData.db";
In my app, a portion of the database is User-customizable.
I call the code above in onStart() with :
So, when the user presses "reset database to standard" (in preferences screen), I just set the Boolean
initialiseDatabase
to "false" and wait for the user to go back to the main activity. (thus calling onstart and copying the original database).I tried to call the Activity.copyDB() from the preferences.java. It's neater, because it doesn't require the user to go back to the main activity to rebuild the database. However, I get an error about not being able to call static references to non-static methods. I don't understand that, but will look into it.