如何使用模型实现简单的REST和ContentProvider架构?

10

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

为了尽可能地使用Android平台,我决定选择选项B,即使用ContentProviderSyncAdapter。这为我提供了内置的帐户系统、内容观察器以及当Internet可用时的周期性同步。

因为我们的应用程序的一个非常重要的功能是离线编辑和可用性(它在网络信号不好的环境中使用),所以我们希望尽可能地在本地保存相关数据。

客户端使用JSON的RESTful API与服务器通信,使用Gson将服务器上的数据反序列化到模型(POJO's,简单的Java对象)中。

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

然而,这种架构感觉非常臃肿。

  • 首先,无法可靠地获取有关当前SyncState的信息(以向用户提供反馈)。(现在使用这个SO答案进行“黑客攻击”)

  • 第二个问题是,对于每个资源,我将需要:一个模型、一个映射器、一个表定义和ContentProvider URIs。这是为了管理只有一个资源的大量代码。

第三个问题是,通过我的映射器要求模型,我阻止自己在活动中使用CursorLoader
底线是,我正在寻找一种可维护且轻量级的方式来使用Json与RESTful web服务具有离线内容和同步,并且希望能够在代码中使用模型,因为user.getName()cursor.getString(cursor.getColumnIndex(UserDataSource.COLUMN_NAME))更友好(这当前隐藏在我的Mapper类中)。
一个很好的映射示例是针对.NET编写的DapperDapper Extensions相结合,但类似于我的方法,我需要在许多不同的文件中定义所有列和字段(请参见上文)。
此外,我正在考虑从我的代码中删除ContentProvider,因为它对于这样一个简单的任务来说感觉非常臃肿和过时。

在我看来,ContentProvider + Cursors 比 POJO 更适合用于 ListView ... 使用 POJO 会遇到许多数据刷新的问题(POJO 或 POJO 的 Array/ListArray 怎么知道服务器上的数据已更改并进行同步)... 关于问题:第一,CP 的每个 update/insert/delete 操作都会尝试与服务器同步 ... 第二,不要自己编写代码生成器(例如从 XML 或编译时注释中生成)或使用运行时生成 CP 的注释 ... 第三,确实如此 ... 这就是为什么我根本不使用它的原因 ... - Selvin
有没有好的现有解决方案来解决问题#2,或者甚至更完整的解决方案,例如一个只需要每个资源定义一次的封装库?我同意关于问题#1和#3的观点,但我们使用一些自定义的数据显示方式(画布)。我猜这可以通过实现某种类型的光标适配器来解决。虽然我不确定在画布上是否可能实现这一点。 - christiaanderidder
1个回答

1

你考虑过使用ORM吗?我过去曾成功地使用OrmLiteJackson的组合。你需要编写自己的同步服务,但是OrmLite会在处理数据模型时处理繁重的工作。

尽管当你使用POJOs时,你不会获得ContentProvider + SyncAdapter组合提供的某些便利(仍然没有CursorLoader),但这种设置可能会减轻复杂架构和/或大量类型的负担。

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

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

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

正如您所看到的,模型+映射+表定义很快且轻松地组合在一起。

我考虑过使用ORM,但是对于Android来说,最佳实践仍然让我犹豫。因为ContentProvider+SyncAdapter提供了一些额外的功能,但另一方面也需要很多臃肿的代码。我会接受你的答案,因为为了可读性和可维护性,我可能会尝试ORM的方法。 - christiaanderidder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接