Android Bulk插入或更新而不是insertOrReplace

时间:2017-05-15 06:10:01

标签: java android sql database sqlite

我的问题

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

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

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

4 个答案:

答案 0 :(得分: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个这样的查询(创建一个包含所有这些的String)并使用SQL Batch插入运行它。喜欢这个

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

这样做时要考虑一件事。 一旦插入记录,它将更新(具有相同的值)(稍微开销但在忽略的情况下它完美地工作)。 希望它有所帮助。

答案 1 :(得分:0)

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

进行插入

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

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

CursorLoader将是一个很好的解决方案。它不会影响执行时间,但至少你可以显示加载对话框,以便在尚未实现的情况下使其具有性能。

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

另一个建议是覆盖表示记录ID的哈希和相等方法。因此,当您使用.equals()方法检查它是否存在时,检查它是否存在的方法会更快。

您应该避免批量操作。

祝你好运。