Android:为 MySQL 和 SQLite 数据库设计

标签 android mysql sqlite activerecord orm

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

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

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

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

UML-diagram User Data Access Object and Model

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

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

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

感谢您的帮助!

最佳答案

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

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

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

编辑:

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

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

关于Android:为 MySQL 和 SQLite 数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28763609/

相关文章:

java - Microsoft Azure 翻译 API 身份验证方法

android - 如何一次使用多个标签过滤 Android adb shell logcat?

mysql - 如何使用 SQL 连接从四个表中获取数据

mysql - 检查MySQL中是否存在数千条记录

c# - Sqlite设置序列化模式抛出异常

c - 检索 sqlite 结果集中的行的 rowid

android - Android 中的 SQI 和 CQI 值

android - 尝试从 HashMap 字符串获取 Double 值时出错,从 Firebase 获取的对象

android - 如何解决java.lang.NullPointerException?

android - 直接从 Assets 中以只读方式打开sqlite