【问题标题】:Android Bulk insert Or Update rather then insertOrReplaceAndroid Bulk insert or Update 而不是 insertOrReplace
【发布时间】:2017-05-15 06:10:01
【问题描述】:

我的问题

我正在处理Android application(使用SQLite),我必须从服务器获取大量数据并将store 它发送到DB。目前,我正在从服务器获取一个list,循环遍历它,然后将inserting 逐一转换为DB。但在每条记录insertion 之前,我正在检查它是否已经存在于DB 中。如果是,那么我update 那条记录。这发生在application (我的应用程序有超过 50 个表)。现在一周前我注意到这个过程需要额外的时间。我的意思是我们从服务器得到一个列表,我们循环遍历它并为每条记录运行两个queries(一个检查它是否已经存在,一个用于insert或@987654336 @)。

现在我需要optimise 它。我知道批量插入,我正在考虑一次插入所有记录。但其中有一个问题。我需要检查记录是否已经存在于DB 中。如果是,则 update 否则 insert。我知道insetOrReplace,但它不符合我的目的。我需要更新一些特定的记录而不是替换所有内容(如果数据已经在数据库中并由用户从本地应用程序填充)。

那么它的solution 是什么?我是否必须通过一个查询检查DB 中已经存在哪个records,然后对update 记录运行一个查询,对剩余的insert 运行一个查询?但它仍然是三个查询?只能通过一个查询来解决吗?或者任何其他解决方案?

【问题讨论】:

  • 你知道SQLTransaction 吗? Check this
  • 你可以使用 #realm sdk news.realm.io/news/realm-for-android .. 它比 sqlite 更高效,但它增加了你的应用程序大小更多.. 你的需求肯定会通过领域来满足。
  • 要使用领域我必须改变很多结构。而且还有我的大量表格,它会增加应用程序的大小..

标签: java android sql database sqlite


【解决方案1】:

经过两天的工作。我终于找到了解决方案。从而提高处理速度超过 35%。此外,这种技术有助于我的情况(插入如果不存在则更新)。 SQLite 有方法insertOrIgnore。顾名思义,它插入记录或忽略它(在主键上)。所以对于第一部分。

 insert or ignore into contact ( _id  , cntct_id ) )  
 values ( COALESCE ( ( Select _id from contact where _id = '10' or cntct_id = '46'  ) ,null ), '46') ;

现在,这个插入检查,如果主键 _id 已经存在,它将忽略插入。这是另一部分。哪个会更新记录?

Update contact set cntct_id = '46' ,_id='10'  , where _id = 10 or cntct_id = '46';  

所以我生成了 30 个这样的查询(创建一个包含所有这些的单个字符串)并使用 SQL 批处理插入运行它。像这样

    SQLiteStatement statementAdd = database.compileStatement(addQuery);
statementAdd.execute();

执行此操作时需要考虑的一件事。 插入记录后,它也会更新(具有相同的值)(有点开销,但在忽略的情况下它可以完美运行。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    如果您想要简单的解决方案,请根据您的主数据删除数据并使用批量/批量插入进行插入

    【讨论】:

    【解决方案3】:

    SQLite 是一个没有客户端/服务器通信开销的嵌入式数据库,因此无论您执行大量简单命令还是进行一些批处理操作(实际的 C API 甚至没有批处理操作)都无关紧要。

    要快速执行大量命令,请将所有命令放在一个事务中。

    【讨论】:

    • 这就是我想要做的。请再次阅读我的问题。希望您能提供帮助
    【解决方案4】:

    NoSQL 是性能的最佳解决方案之一,但对您来说可能为时已晚。您已经有 50 多张桌子了...

    CursorLoader 将是一个不错的解决方案。它不会影响执行时间,但如果您还没有实现,至少您可以显示加载对话框以使其具有执行性。

    我对您的数据库架构了解不多,但另一种解决方案是从您的服务器获取差异集,直到您的数据库版本在两个平台(服务器和您都是)中都有。

    另一个建议是覆盖表示记录 id 的 hash&equal 方法。因此,如果您自己检查它是否存在,当您使用 .equals() 方法时,您检查它是否存在的方法会运行得更快。

    您的观点应该是避免批量操作。

    祝你好运。

    【讨论】:

    • 这些都没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多