草庐IT

android - 更新本地 Android 数据库

coder 2023-07-21 原文

我目前在 Android 上遇到 SQLite 数据库问题。

我的应用程序有一个本地数据库,它位于 apk 中。文件。当应用程序启动时,它会检查新版本,并在可用时下载全新的数据库(尽管在两个数据库版本之间,变化很小)。但是现在数据库太大了。所以新数据库可用时需要很长时间。那么这个问题有什么解决方案吗?

最佳答案

基本理念

这就是我要怎么做。我在这里假设客户端应用程序不会对本地数据库进行更改(除非它下载了新版本),因此只有几个可能的数据库版本存在(每次你一个在服务器端进行了更改)。

  • 向每个名为 LastModified 的表添加一列,默认值为 NOW() .这意味着每次向主副本添加内容时,它都会得到更新的 LastModified环境。您必须确保您的更新(而不是插入)更改 LastModified场也是。
  • 在数据库中的某处(Settings 表或其他东西)存储一个字段,用于跟踪该版本数据库在服务器上的发布日期(称为 PublishDate)。
  • 当客户端想要检查新版本时,它会发送它的 PublishDate到服务器。然后服务器检查每个表,并找到 LastModified 所在的每一行。紧随其后 PublishDate .它向客户端发送 SQL 以在客户端上插入或更新这些行。它还发送新的 PublishDate以便客户端可以在其本地副本中更新它。

  • 这涉及插入和更新。它不处理删除。在您的情况下,它们可能不是问题;如果它们是:
  • 添加一个单独的表来记录删除,您还可以在其中跟踪 LastModified ,以便您可以告诉客户端要删除哪些行;或者最好有一个设置,您实际上不会删除任何行,而只是将它们更新为标记为“已删除”。

  • 最后,这不会处理架构更改。同样,希望这对您来说不是问题:希望您有一个稳定的架构。但是,如果您确实需要添加或删除表或索引或其他内容,则必须单独完成:
  • 创建一个 SchemaChanges主表上的表格,每当您进行结构更改时,请将相关详细信息放入 SchemaChanges table ,还有一个 LastModified日期,以便您也可以根据要求将其发送给客户。如果您这样做,您需要先将架构更改发送到客户端,因为它们可能会影响其他更改的含义。

  • 现在这样做的好处是您可以在服务器上预处理所有内容(因为只有几个版本存在)。对于每个旧版本,您可以计算将旧版本升级到新版本的更改(基于上述详细信息),然后将生成的 SQL 存储在服务器上。如果你这样做,你就不需要动态生成 SQL:当客户端发送 PublishDate 时。 ,您只需查找您已经计算过的 SQL,该 SQL 将从 PublishDate 转换版本。到最新版本。

    替代实现

    有一种很好且简单的方法可以插入上述方案为您提供的更改,即使是不需要的轻微简化 LastModified时间,或者实际上对您现有结构的任何更改。在服务器端,您已经拥有旧版本(因为您拥有所有旧版本)和新版本,您创建两个数据库的 SQL 转储,然后运行 ​​diff通过它们生成补丁文件,您可以将其发送到客户端应用程序。客户端应用程序将使用相同的 Java 库生成旧版本的 SQL 转储,然后应用 diff修补它以创建新版本的完整 SQL 转储。此时,它可以删除旧数据库并从 SQL 转储创建新数据库。

    如果更改不是批量更改,这将非常有效(在这种情况下,您最好只推送新的 .db 文件)。

    通过 invoking the SQLite binary 很容易做到这一点创建转储。根据 this way,您需要为 Android 稍微修改该方法。执行外部命令。

    您可以使用 this Google library在服务器端计算差异补丁并在客户端应用它们。

    关于android - 更新本地 Android 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969079/

    有关android - 更新本地 Android 数据库的更多相关文章

    1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

      我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

    5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

      有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

    6. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

      我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

    7. ruby - 我如何添加二进制数据来遏制 POST - 2

      我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

    8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

      无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

    9. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

      本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

    10. 使用canal同步MySQL数据到ES - 2

      文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

    随机推荐