Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 批量数据库运行策略_Android_Sql_Sqlite_Bulkinsert - Fatal编程技术网

Android 批量数据库运行策略

Android 批量数据库运行策略,android,sql,sqlite,bulkinsert,Android,Sql,Sqlite,Bulkinsert,我在Android应用程序中运行了一个SQLite DB,它可以在一个月内批量传输用户数据 在应用程序首次运行时,由于还没有下载数据,存储插件是一件小事 然而,当用户重新下载一个月的数据时(为了从主数据库获得任何可能的更新(我想推送小的单记录更新,但这是2.0功能)),我需要找到一种有效的方法来存储记录 目前,我使用暴力,只需删除刷新月份的所有记录,然后插入。我不想有一大堆逻辑和数据库访问,或者存储元数据,来跟踪哪些记录是新的,哪些是现有的,然后相应地执行插入和更新 我的老板说删除可能是一个昂贵

我在Android应用程序中运行了一个SQLite DB,它可以在一个月内批量传输用户数据

在应用程序首次运行时,由于还没有下载数据,存储插件是一件小事

然而,当用户重新下载一个月的数据时(为了从主数据库获得任何可能的更新(我想推送小的单记录更新,但这是2.0功能)),我需要找到一种有效的方法来存储记录

目前,我使用暴力,只需删除刷新月份的所有记录,然后插入。我不想有一大堆逻辑和数据库访问,或者存储元数据,来跟踪哪些记录是新的,哪些是现有的,然后相应地执行插入和更新

我的老板说删除可能是一个昂贵的操作,这是真的吗?我是否应该加入一些逻辑来确定哪些记录应该更新,哪些应该插入,而不是先删除然后插入?这个策略还需要确定在masterdb端删除了哪些记录(我选择删除的另一个原因)

如果有一个完全更好/更有效的方法来做到这一点,我还没有提到,请让我知道。谢谢

我的老板说删除可能是一个昂贵的操作,这是真的吗

这取决于“昂贵”的定义。我不知道,对于同样受影响的记录,删除
比更新
要昂贵得多(事实上,可能更便宜)

我是否应该加入一些逻辑来确定哪些记录应该更新,哪些应该插入,而不是先删除然后插入

我们无法很好地回答这个问题,因为它在很大程度上取决于您的环境,例如数据库模式

确保将这些操作包装到事务中,因为这对批量操作的速度有很大影响


除此之外,您还需要运行一些自己的性能基准测试,以确定成本有多高
DELETE
+
INSERT
超过
UPDATE
,因此,尝试切换到以
UPDATE
为中心的策略是否值得为开发头疼。

Delete+Insert是两个数据库操作,而不是一个带有UPDATE的操作。如果涉及到索引,成本可能会更高。问题是,您处理了多少数据?我会先用delete+insert做一个音量测试。如果性能可以接受,您可能会争辩说,采用更复杂的策略是不值得的……规模较小的城市大约需要1MB,规模较大的城市可能需要更多。我们将,因为大多数操作都是更新的,所以有另一个原因需要添加逻辑,尽管我真的不愿意,因为时间是一个主要因素。我确实在其他需要独占写访问权限的地方使用事务(当后台进程在没有数据库连接的情况下更新排队的记录,并且用户可能打开了记录,以及许多其他有趣的场景时)。我正在研究的这个领域需要进行重大优化,b/c目前,对于每个记录和子记录,都会执行单独的DB操作,包括打开和关闭DB连接。这只是它的进展情况,但速度很慢。无论我选择什么路线,我都肯定会作为批量操作(构建一个或几个bug命令字符串).ThnksI认为SQLite隐式地将所有命令包装在一个事务中?因此,如果我确实执行了一个包含数百或数千个插入的大容量(如在大容量字符串上)命令,它不是已经存在于一个事务中了吗?你如何定义大容量,b/c我认为我的想法与你的不同?@SamusArin:“如果我执行了一个大容量的命令(就像在海量字符串中)包含数百或数千个插入的命令,它不是已经存在于事务中了吗?--我从来没有尝试过。我希望它是“数百或数千”个事务。更不用说构建一个表示“数百或数千”的SQL字符串将是对RAM的巨大浪费请使用
beginTransaction()
和kin包装单个
execSQL()
调用事务。哦,伙计,如果你告诉我我需要做的就是将所有内容打包到事务中,我将进行设置!我将试一试。非常感谢你也进行了清理。它成功了!我只需将1分钟缩短到10秒!!!我的存储库已经设置为执行事务,我只是在这个过程中没有使用它们非常感谢,我很高兴能够利用我现有的代码,而不必编写一个全新的数据访问层来构建一个巨大的命令字符串!