【问题标题】:Android: Designing for MySQL and SQLite databaseAndroid:为 MySQL 和 SQLite 数据库设计
【发布时间】:2015-04-30 01:53:34
【问题描述】:

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

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

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

第二个问题更多的是设计问题,见附图:

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

我觉得这不是“好的设计”——当我习惯使用 Doctrine2 时,我从 PHP 中获得了这种感觉,感觉有点不对。

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

感谢您的帮助!

【问题讨论】:

    标签: android mysql sqlite activerecord orm


    【解决方案1】:

    要回答有关“最新数据”的问题 - 您应该能够访问设备和服务器上的 GMT 时间。尽管用户或设备可能会不准确地报告这一点,但如果您将其标准化为 GMT(删除时区更改和夏令时调整),您将拥有最可靠的时间指示器。此外,您还可以包括“记录号”之类的内容,并根据最近的更新验证它,以及 GMT 时间戳是否与正在进行的其他更新相似。您还可以对看似可疑的数据做出“无效记录数据”响应。如果用户以某种方式弄乱了 GMT 设置,您可以在更新中构建监控以查看更新是否“有意义”——但大多数情况下,这不太可能发生。 GMT 时间戳通常就足够了。

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

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

    编辑:

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

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

    【讨论】:

    • 谢谢!很好的答案。我还没有将其作为已接受的对象,因为我仍在寻找有关如何处理对象 绑定的提示,当对象具有数据库中也可用的另一个对象(递归,对象处理?)ORM使用 Doctrine2 但使用级联完美地解决了这个问题。 - 处理高级对象 数据库绑定的“典型”方式是什么?什么时候不使用 ORM?是否有任何设计模式或者我应该直接使用数据库调用而不将它们绑定到对象?你对此有什么建议吗?设计模式?
    • 级联是处理此问题的一种方法。由于您正在实现自己的系统,因此您应该首先考虑您的用例。我已经编辑了我的答案,以提供一个通用的“数据已过期”通知概念。在大多数情况下,您可以在更改完成后简单地通知数据集已更改。
    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2012-04-17
    • 2016-07-09
    相关资源
    最近更新 更多