【问题标题】:Client Server data sharing issue客户端服务器数据共享问题
【发布时间】:2011-11-24 14:32:17
【问题描述】:

我有一个带有移动应用程序的网络服务。用户与应用程序共享服务器上的数据 - 在数据库中有一个约束,即共享对象的名称对于每个用户都是唯一的。此外,应用程序在本地存储所有创建的数据(由用户创建 - 这也是共享的)。

我有以下场景:

  1. 用户使用数据名称 X 创建数据。
  2. 用户共享此数据。
  3. 服务器中有该用户的数据库数据名称 X
  4. 用户有一部新手机并安装应用程序。
  5. 没有互联网连接
  6. 用户使用数据名称 X 再次创建数据。
  7. 它只存储在本地 - 因为没有互联网连接。
  8. 互联网连接已恢复。
  9. 现在 BG 服务运行并开始共享所有您共享的数据 - 在 BG 中。
  10. 由于约束而发现的问题。

应该怎么做才能解决问题?我可以弹出一个新窗口,说它已经共享并要求用户重命名/覆盖它,选择 D/L 将此数据存储到其本地 DB 等。但由于它是在 BG 中完成的 - 它对用户友好吗?显示此弹出窗口?

还有其他想法吗?

可能有一种常见的方法。

我真的可以使用一些帮助来重新解决这个问题。

【问题讨论】:

    标签: android database client sharing


    【解决方案1】:

    这是我最近完成的一个应用程序如何处理这个问题:

    1. 用户在移动设备上创建新记录。新记录被分配一个负的主键 _id 号。
    2. 应用程序检查互联网连接,如果存在连接,应用程序会向服务器发送 HTTP 帖子,在服务器端创建记录。然后,服务器发回创建新 PK _id 的响应,该 PK _id 会在应用程序中更新。
    3. 如果没有互联网连接,应用程序会在我的 db_changes 表中创建一条记录,其中包含表名和新记录的 PK _id。
    4. 服务以 5 分钟为增量运行,该服务从服务器获取更新并将新数据发布到服务器。每次都会轮询 db_changes 表以查找任何尚未发布到服务器的现有插入或更新。
    5. 一旦成功,db_changes 表中的记录就会被删除。

    在我的情况下,这非常有效。

    【讨论】:

    • 但是当要发布的更改与现有服务器数据库有问题(例如唯一约束等)时,这并不能解决问题
    • 在我的例子中是这样,因为唯一的约束是 PK _id,它需要由服务器生成。
    • 但我有一个问题 - 因为我将唯一性定义为用户创建的 NAME 条目
    【解决方案2】:

    为此,您通常不使用名称或类似名称,而是使用 UUID - 即 32 到 64 个字符长的随机字符串,用于唯一标识对象。创建对象时,只需在设备上创建一个 UUID 并将其同步到服务器。这是android中UUID类的文档。

    虽然理论上具有相同的 UUID 是可行的,但您通常不必太担心,如下所述:http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates

    对于iOS,可以使用CFUUID类来生成UUID

    UUID 的另一个名称是 GUID,全局唯一标识符。因此,您可以删除任何类型的唯一性约束。

    【讨论】:

    • 嗯...所以您建议使用每个用户唯一的 UUID?但是会不会生成一个已经存在的 UUID(存在于服务器上)?
    • UUID 始终是唯一的。您只需为每个对象获得一个新对象。它们在您的整个系统中将是独一无二的。
    • 但是如果我创建了一个 UUID(它是本地唯一的),那么如果将应用程序安装在具有相同 userId 的新设备上,那么我猜新安装的应用程序可能会生成一个现有的UUID(因为它的数据库是明确的等)
    • 好的,那么 iPhone 有相同的功能吗?
    • 所以实际上以这种使用 UUID 的方式这意味着实际上不会有唯一的名称约束 - 我是对的 >
    猜你喜欢
    • 2012-06-04
    • 2020-05-16
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2011-05-26
    • 2016-05-03
    • 2018-05-13
    相关资源
    最近更新 更多