10

我目前正在开发一个与 RESTful 网络服务交互的 android 应用程序。客户端能够在 Web 服务上执行完整的 CRUD。在搜索了最佳实践之后,我观看了Google I/O 2010 关于 REST 客户端的主题演讲,几乎所有文章都引用了该主题演讲。

为了尽可能多地使用 android 平台,我决定使用选项 B,使用 aContentProvider和 a SyncAdapter。这为我提供了内置帐户系统、内容观察者和互联网可用时的定期同步。

因为我们应用程序的一项非常重要的功能是离线编辑和可用性(它用于接收不良的环境),我们希望尽可能多地在本地保存相关数据。

客户端使用Json中的RESTful API与服务器通信,来自服务器的数据使用模型上的Gson(POJO,普通旧 java 对象)进行反序列化。

为了使代码清晰易读,我尝试构建自己的对象映射器,而不是直接使用 a Cursor。此映射器提供默认的 CRUD 操作,并在读取数据时将光标映射到模型,在写入数据时将模型映射到ContentValues 。

但是,这种架构感觉非常臃肿。

  • 首先,不可能获得有关当前的可靠信息SyncState(以向用户提供反馈)。(现在使用这个 SO 答案“被黑”了)

  • 第二个问题是,对于我需要的每个资源:模型、映射器、表定义和 ContentProvider URI。仅针对一种资源就需要管理大量代码。

  • 第三个问题是通过我的映射器需要模型,我阻止自己CursorLoader在活动中使用 a。

底线

我正在寻找一种可维护轻量级的方式来获得离线内容并使用Json与 RESTful 网络服务同步。此外,我希望能够在我的代码中使用模型user.getName(),因为它比开发人员更友好cursor.getString(cursor.getColumnIndex(UserDataSource.COLUMN_NAME));(目前隐藏在我的 Mapper 类中)。

映射的一个很好的例子是Dapper与为 .NET 编写的Dapper Extensions相结合,但与我的方法类似,但是我的方法需要在许多不同的文件中定义所有列和字段(见上文)。

另外,我正在考虑ContentProvider从我的代码中删除它,因为对于这样一个简单的任务,它感觉非常臃肿和过时。

4

1 回答 1

1

您是否考虑过使用 ORM?过去,我使用OrmLiteJackson的组合取得了成功。您将不得不编写自己的同步服务,但 OrmLite 会在您的数据模型方面负责繁重的工作。

尽管您不会获得 ContentProvider + SyncAdapter 组合提供的一些细节(使用 POJO 时仍然没有 CursorLoader),但这种设置可以减轻复杂模式和/或大量类型的负担。

这是 OrmLite 主页上的表定义示例:

@DatabaseTable(tableName = "accounts")
public class Account {
    @DatabaseField(id = true)
    private String name;

    @DatabaseField(canBeNull = false)
    private String password;   
}

如您所见,模型 + 映射 + 表定义非常快速且轻松地结合在一起。

于 2013-03-22T17:49:52.453 回答