我被要求提供一个用于同步云数据库和设备数据库的双缓存方案。要求是创建一组表,然后在某个时间点,对同一组表的镜像进行同步。完成后,预计ContentProvider将在应用程序不注意的情况下将一个集合交换为另一个集合。
这个是可能的吗?
我能安全地添加-交换-删除表吗?我是否可以安全地添加-交换-删除多个表-某些活动可能正在显示连接?
欢迎评论和想法,但它不是“合并同步”现有表的选项。
我担心的是,在操作表集的Activities或Services中可能存在未完成的游标,并且无法确保它们在删除可能正在访问的表之前关闭了游标。
发布于 2011-04-11 03:37:01
是的,这是可能的(尽管你的客户对两张表的要求听起来像是一个非常丑陋的黑客行为)。
您的ContentProvider应该提供一个游标,以响应特定的内容URI。如何将该URI映射到数据库中的表完全由您决定。
这样做:使用相同的数据库模式创建两个表"data1“和"data2”。像往常一样用你的数据填充data1。当应用程序查询您的URI时,使用一个游标来响应,该游标填充了data1之外的数据。
稍后,填满data2。当命令到来时,是时候切换表了,使用用于该数据的(一个) URI调用notifyChange()。所有正在监听的游标(您的显示应用程序正在使用RegisterContentObserver(),不是吗?)将被通知您的URI处的数据已更改。当他们收到通知时,他们会重新查询。这一次,您的ContentProvider将使用来自table2而不是table1的数据进行响应……游标不知道它是从哪个表中填充的,只知道它是从哪个URI填充的。因此,对于使用数据的应用程序来说,更改是完全透明的(只要两个表具有相同的模式)。
我已经忽略了命令开关和保存哪个表是活动的。这显然是一种特定于您的应用程序,但您应该能够找到一种很好的方法来持久化该信息。
至于表连接...当然,诀窍是确保连接逻辑本身发生在ContentProvider内部,而不是应用程序内部。然后,您只需一次切换几组表,并连接出正确的组。
最后,对于陈旧的游标,游标包含表数据的副本,而不是对表本身的任何引用。因此,如果表消失,在最坏的情况下,游标数据将变得陈旧。它不会让桌子开着或类似的东西。游标保留对它所来自的内容URI的反向引用,而不是表。所以,再一次,当它需要的时候,它会像上面一样工作。
https://stackoverflow.com/questions/5366707
复制相似问题