Cao*_*Dat 6 database sqlite android
我目前在Android上遇到SQLite数据库问题.
我的应用程序在apk文件中有一个本地数据库.当应用程序启动时,它将检查新版本,并下载全新的数据库(如果可用)(尽管在两个数据库版本之间,更改很少).但是现在数据库太大了.因此,新数据库可用时需要很长时间.那么解决这个问题的方法呢?
这是我怎么做的.我假设客户端应用程序不对本地数据库进行更改(除非下载新版本),因此只存在少数可能的数据库版本(每次都有一个版本)在服务器端进行了更改).
LastModified,默认值为NOW().这意味着每次向主副本添加内容时,都会获得更新的LastModified设置.您必须确保更新(而不是插入)LastModified也会更改字段.Settings表或某物)中的某处存储一个字段,该字段跟踪在服务器上发布此版本数据库的日期(称之为PublishDate).PublishDate到服务器.然后,服务器检查每个表,并查找LastModified后面的每一行PublishDate.它将SQL发送到客户端以在客户端上插入或更新这些行.它还发送新的,PublishDate以便客户端可以在其本地副本中更新它.这涉及插入和更新.它不处理删除.在你的情况下,它们可能不是问题; 如果它们是:
LastModified,以便您可以告诉客户端要删除哪些行; 或者最好有一个设置,你实际上没有删除任何行,但只是更新它们以标记为"已删除".最后,这不会处理架构更改.再次,希望这不是你的问题:希望你有一个稳定的架构.但是,如果您确实需要添加或删除表或索引或其他内容,则必须单独完成:
SchemaChanges在主服务器上创建一个表,每当进行结构更改时,将相关详细信息SchemaChanges与LastModified日期一起放入表中,以便您也可以根据请求将其发送给客户端.如果您这样做,您将首先要将架构更改发送到客户端,因为它们可能会影响其他更改的含义.现在这样做的好处是你可以预先处理服务器上的所有内容(因为现有的版本只有几个版本).对于每个旧版本,您可以计算将旧版本更新到新版本的更改(基于上面的详细信息),然后将生成的SQL存储在服务器上.如果这样做,则无需动态生成SQL:当客户端发送时PublishDate,您只需查找已经计算过的SQL,将该版本从该版本转换PublishDate为最新版本.
有一种很好的简单方法可以推动上述方案为您提供的更改,即使只是略微简化,不需要LastModified时间,或者实际上对现有结构进行任何更改.在服务器端,您已经拥有旧版本(因为您拥有所有旧版本)和新版本,您可以创建两个数据库的SQL转储,然后diff在它们上运行以生成可以发送到的版本的补丁文件客户端应用.客户端应用程序将使用相同的Java库生成旧版本的SQL转储,然后将diff修补程序应用于该转储以为新版本创建完整的SQL转储.此时,它可以删除旧数据库并从SQL转储创建新数据库.
如果更改不是批量更改(在这种情况下您可能只是推送新.db文件),这将非常有效.
通过调用SQLite二进制文件来创建转储,这很容易做到这一点.根据这种执行外部命令的方式,您需要稍微修改Android的方法.
您可以使用此Google库来计算服务器端的差异补丁,并在客户端应用它们.