什么是重置SQLite表的最有效方法

时间:2018-01-29 15:10:27

标签: android sqlite

我在SQLite中重置特定表时遇到问题。此表包含超过2000行,每次启动应用程序时都需要更新它。由于我必须放置的数据并不总是相同,我认为我能做的最好的事情是重置整个表并再次添加2000行。问题是需要花费很多时间。我已经尝试了所有东西,但它需要工作的时间仍然很多。

有没有人知道更好的方法呢?

以下是重置最适合我的表格的代码:

     public void resetSearchableTable(){

    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("DELETE FROM "+TABLE_SEARCHABLE_COINS);
}

以下是我每次使用它的方式:

      db.resetSearchableTable();
                //add coins to db
                for (Coin coinInList : listCoins) {

                    db.addSearchableCoin(coinInList);


                    //Log.d("searchable coin ", coinInList.getName() + "  " + coinInList.getShortName());
                }   

1 个答案:

答案 0 :(得分:0)

这是一般问题的一般答案,但其中一个解决方案可能对您有用:

  • 编辑:不支持使用TRUNCATE;使用截断优化不会向问题中已尝试的解决方案添加任何内容。如果无条件DELETE FROM [table]太慢,请尝试使用TRUNCATE TABLE。它可能会快得多;在某些情况下,对我来说一直如此。但是,您必须根据自己的情况对其进行基准测试。
  • 或者,尝试dropping并重新创建表(如果多个线程同时与表进行通信,这可能会很棘手;在这种情况下,您可能需要idempotent表创建功能,或围绕它的锁定)。

如果所有这些都太慢,则性能问题可能是由与数据库使用的永久存储器通信所花费的时间量引起的。在这种情况下,您还有其他一些选择:

  • 如果可能,请确保调整sqlite数据库的性能。这可能包括将其切换为/ WAL mode,和/或控制synchronization chunk sizes或其他效果技巧。
  • 如果所有其他方法都失败了,则可能需要修改代码的行为。如果您可以使用临时/唯一名称制作表,例如searchable_coins_489(并告诉代码向表中写入新名称),然后你可以"分叉并忘记"删除:创建一个新线程,在其中发出DROP TABLE,然后在主线程中忘记它(不要等待它完成)。由于数据库由相同的文件支持,这可能不会产生与存在多进程远程数据库时相同的性能优势,但它可能有助于您的情况 - 特别是如果您处于WAL模式。再次,基准测试是关键。