我目前正在开发一个与RESTful Web服务交互的Android应用程序。客户端能够对Web服务执行完整的CRUD操作。在搜索最佳实践后,我观看了几乎所有文章中引用的有关REST客户端的Google I/O 2010主题演讲。
为了尽可能地使用Android平台,我决定选择选项B,即使用ContentProvider
和SyncAdapter
。这为我提供了内置的帐户系统、内容观察器以及当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编写的Dapper与Dapper Extensions相结合,但类似于我的方法,我需要在许多不同的文件中定义所有列和字段(请参见上文)。
此外,我正在考虑从我的代码中删除
ContentProvider
,因为它对于这样一个简单的任务来说感觉非常臃肿和过时。