Android:设计MySQL和SQLite数据库

时间:2015-02-27 11:06:25

标签: android mysql sqlite activerecord orm

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

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

第一个问题是 - 我如何能够知道哪个数据库包含最新版本?我无法相信时间戳,因为任何人都可以更改手机上的时间设置,对吗?

第二个问题更多的是设计问题,请参阅附图:

UML-diagram User Data Access Object and Model

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

我觉得这不是“好的设计” - 来自PHP,当我习惯使用Doctrine2时,这只是感觉不对。

在处理数据库和对象时,我还应该阅读其他任何模式吗? (我现在想远离ORM框架以获得更多控制权)或者我应该只使用纯数据访问对象而不构建模型对象?有小费吗?在尝试设计应保存到数据库的“拥有对象的对象”时,我在使用数据访问对象或活动记录时遇到困难。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

要回答有关“最新数据”的问题,您应该能够在设备和服务器上访问GMT时间。虽然用户或设备可能会报告此不准确,但如果您标准化为GMT(丢弃时区更改和节省日期时间调整),您将拥有最可靠的时间指示器。此外,您还可以包含“记录编号”之类的内容,并根据最近的更新验证GMT时间戳是否与正在进行的其他更新类似。您还可以对看似可疑的数据进行“无效记录数据”响应。如果用户以某种方式混淆了GMT设置,您可以构建对更新的监控,以查看更新是否“有意义” - 但大多数情况下,这种情况不太可能发生。 GMT时间戳通常就足够了。

在“设计”问题上,您需要一个“记录系统”或SOR - 换句话说,设备数据库应该是用于显示的SOR。如果您的HTTP对象指示SOR已过期,则应更新设备上的SOR,因为您的服务器是集中数据的SOR。一旦设备SOR的更新完成,它应通知显示器数据已被修改并需要刷新。

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

编辑:

Cursor通过使用registerContentObserversetNotificationUri等方法来处理与数据库的绑定。换句话说,数据一致性问题归结为数据的紧迫性/重要性。如果核心数据发生变化但显示不变,那会产生什么问题?在您的情况下,您可能应该实施某种类似的更改注册。该注册可以包括一系列可能的方法(例如“数据不同步”和“同步数据”和“更新数据”等)。基本上,它需要创建一个对象可以注册的侦听器接口,然后选择将监视数据库中的哪些数据。然后,当您感兴趣监视任何事件时,只需向这些侦听器发送通知。

例如,您可以让HTTP DAO通过“updateInProgress”注册来通知更新正在进行中。如果您只关心数据更新后,那么在更新数据库中的表后,您可以获得“datasetChanged”侦听器通知。