1

我正在使用 Virgil Dobjanschi 的选项 B(来自本次演讲:http ://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html )在我的 Android 应用程序上实现 Web 服务连接到 Google Cloud Endpoints RESTful 服务(因此,我的 URL 被抽象了)。

本地 SQLite 数据库需要一个主键(必须称为 _id 以便它可以与 ListView 链接)。AppEngine 服务还要求每条记录有一个唯一的 ID。服务中的资源在多个客户端之间共享,因此它们的 ID 在服务器上需要保持唯一。资源 ID 是从其他两个 ID 派生的,并以字符串的形式生成。

按照设计,这些资源永远不会在 Android 应用程序上本地创建,它们只会被读取和更新——创建和删除发生在其他地方,然后通过 Google Cloud Messaging 发送创建的资源,并附上它们的 REST Id,并插入到 SQLite 表中. 如果我在本地创建它们,我也可以在本地从 REST 资源生成唯一 ID。

我应该让 SQLite 数据库上的 ID 是一个单独的唯一 ID,在本地维护,并将 REST ID 存储在记录中,还是应该将 SQLite ID 设置为与 REST ID 相同?

IE:

我的 REST 资源采用以下形式:

String id; // unique, derived from two other ids
String data;

我的 SQLite 选项是:

create table myResource (
  _id INTEGER PRIMARY KEY AUTOINCREMEMT,
  restId TEXT,
  data TEXT);

或者:

create table myResource (
  _id TEXT PRIMARY KEY,
  data TEXT);

在第一个选项中,我也可以将 restId 设为唯一。我倾向于第二种选择,但我想知道这种方法是否会遇到无法预料的问题。

对于一些不同的资源,我还有另一种类似的情况,其中 REST 键是 Long 而不是 String,但我仍然质疑我是否应该维护一个与 REST 资源 ID 分开的本地主键。

4

1 回答 1

0

似乎最好对 SQLite 中的 _id 字段使用整数,这意味着它们不一定与 AppEngine 中的字符串键匹配。

http://developer.android.com/reference/android/content/ContentUris.html将id 称为“唯一的数字标识符”,并提供要求它为 long 的辅助方法。

可能可以解决这个问题,但鉴于此假设内置于 ContentUris,我希望它也将内置于其他地方,因此使用保留在应用程序内部的数字 id 来执行此操作会更容易,并强制执行AppEngine 键的唯一性。

于 2013-03-08T13:18:29.343 回答