What is the most efficient way to RESET an SQLite Table
本问题已经有最佳答案,请猛点这里访问。
我在重新设置sqlite中的特定表时遇到问题。这个表包含2000多行,我每次启动应用程序时都需要更新它。因为我必须输入的数据并不总是相同的,所以我认为我能做的最好的就是重新设置整个表并再次添加2000行。问题是要花很多时间。我已经试过了,但要工作的时间还是很多。
有人知道更好的方法吗?
以下是重新设置最适合我的表的代码:
1 2 3 4 5 | public void resetSearchableTable(){ SQLiteDatabase db = this.getWritableDatabase(); db.execSQL("DELETE FROM"+TABLE_SEARCHABLE_COINS); } |
以下是我每次使用它的方法:
1 2 3 4 5 6 7 8 9 | db.resetSearchableTable(); //add coins to db for (Coin coinInList : listCoins) { db.addSearchableCoin(coinInList); //Log.d("searchable coin", coinInList.getName() +" " + coinInList.getShortName()); } |
这是对一般问题的一般性回答,但其中一个解决方案可能对您有用:
- 编辑:不支持使用截断;使用截断优化不会向问题中已尝试的解决方案添加任何内容。如果无条件
DELETE FROM [table] 太慢,尝试使用TRUNCATE TABLE 。这可能要快得多,在某些情况下我就是这样。不过,你必须根据自己的情况来衡量它。 - 或者,尝试删除并重新创建表(如果多个线程同时与表对话,这可能会很困难;在这种情况下,您可能需要一个等幂表创建函数,或者在它周围加一个锁)。
如果所有这些都太慢,那么性能问题可能是由于与数据库使用的持久存储进行对话所需的时间太长。在这种情况下,您还有其他一些选择:
- 如果可能,请确保您的sqlite数据库已针对性能进行了优化。这可能包括切换到/从wal模式,和/或控制同步块大小或其他性能技巧。
- 如果所有其他方法都失败了,那么对代码行为的修改可能是正确的。如果您可以用临时/唯一的名称创建一个新表,例如
searchable_coins_489 (并告诉向表中写入新名称的代码),那么您可以"分叉并忘记"删除:创建一个新线程,在其中发出DROP TABLE ,然后在主线程中忘记它(不要等待它完成)。由于数据库由相同的文件支持,因此这可能不会产生与多进程远程数据库相同的性能优势,但这可能会对您的情况有所帮助,尤其是当您处于WAL模式时。同样,基准测试也是关键。