Android:为 MySQL 和 SQLite 数据库设计

Android: Designing for MySQL and SQLite database

正如标题所说,我正在创建一个带有 SQLite 数据库的 Android 应用程序。此数据库将与连接到主页的 MySQL 数据库同步(并且将来 MySQL 数据库将与 IPhone 结合使用)。

如果用户在 android 系统或 MySQL 数据库上进行更改,它将在互联网连接可用时同步两者之间的数据。

第一个问题是 - 我如何才能知道哪个数据库包含最新版本?我不能相信时间戳,因为任何人都可以更改 phone 上的 time-setting,对吗?

第二个问题比较design-issue,见附图:

当前的设计计划是使用某种 DataAccessObject 模式,这将帮助我进行数据访问,SQLiteDb 将在第一次向用户显示列表视图(例如)时用于提高速度,并且它将由 HttpUserDAO 在后台更新。

我感觉这不是 "good design" - 来自 PHP 当我习惯使用 Doctrine2 时,这感觉有点不对劲。

在处理数据库和 objects 时,我还应该阅读其他模式吗? (我现在想远离 ORM 框架,以便自己有更多的控制权)或者我应该只使用纯数据访问 objects 而无需构建模型 objects?有小费吗?在尝试为应该保存到数据库的 "objects owning objects" 进行设计时,我在使用数据访问 objects 或活动记录时卡住了。

感谢您的帮助!

回答有关 "most recent data" 的问题 - 您应该能够在设备和服务器上访问 GMT 时间。尽管用户或设备可能会不准确地报告这一点,但如果您标准化为 GMT(放弃时区更改和夏令时调整),您将拥有最可靠的时间指示器。此外,您还可以包含 "record number" 之类的内容,并根据最近的更新验证 GMT 时间戳是否与正在进行的其他更新相似。您还可以对看似可疑的数据进行 "invalid record data" 响应。如果用户以某种方式弄乱了 GMT 设置,您可以在更新中建立监控以查看更新是否 "make sense" - 但大多数情况下,这不太可能发生。 GMT 时间戳通常就足够了。

关于你的"design"问题,你需要一个"system of record"或SOR——换句话说,设备数据库应该是用于显示的SOR。如果您的 HTTP 对象指示 SOR 已过期,它应该更新设备上的 SOR,因为您的服务器是集中数据的 SOR。一旦对设备 SOR 的更新完成,它应该通知显示器数据已被修改并需要刷新。

您是对的 - 您的模型表明存在问题。您不能让显示同时依赖两个数据源。上述模式几乎适用于所有情况。如果它不起作用(例如对于股票交易应用程序),那么您需要消除问题(对于股票交易应用程序,价格的设备记录很容易老化,因此您删除设备 SOR 并显示 "data not available"无法建立 HTTP 连接时的消息)。

编辑:

Cursors 通过 registerContentObserversetNotificationUri 等方法处理与数据库的绑定。换句话说,数据一致性问题归结为数据的urgency/importance。如果核心数据发生变化但显示没有变化,这会产生什么问题?在您的情况下,您可能应该实施某种类似的更改注册。该注册可以包括一长串可能的方法(如 "data out of sync" 和 "synchronizing data" 和 "updating data" 等)。基本上,它需要创建一个对象可以注册的侦听器接口,然后选择要监视数据库中的哪些数据。然后,当您有兴趣监视的任何事件发生时,只需向这些侦听器发送通知即可。

例如,您可以通过 "updateInProgress" 注册让您的 HTTP DAO 通知正在进行更新。如果您只关心数据更新之后,那么在更新数据库中的 table 之后,您可以收到 "datasetChanged" 侦听器通知。