我的问题:
我正在使用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
?但它还有三个疑问?它只能通过一个查询来解决吗?或任何其他解决方案?
答案 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()方法检查它是否存在时,检查它是否存在的方法会更快。
您应该避免批量操作。
祝你好运。