我目前正在开发一个与RESTful Web服务交互的Android应用程序.客户端能够在Web服务上执行完整的CRUD.在搜索最佳实践后,我观看了几乎所有文章中引用的关于REST客户端的Google I/O 2010主题演讲.
要使用尽可能多的Android平台成为了可能,我决定去与选项B使用ContentProvider和SyncAdapter.这为我提供了内置的帐户系统,内容观察者和互联网可用时的定期同步.
因为我们的应用程序的一个非常重要的功能是离线编辑和可用性(它用于接收不良的环境),我们希望尽可能在本地保留相关数据.
客户端使用一个服务器通信的RESTful API中的Json,来自服务器的数据是使用反序列化GSON对模型(POJO的,普通Java对象).
为了保持代码清晰易读,我尝试构建自己的对象映射器,而不是Cursor直接使用.此映射器提供默认的CRUD操作,并在读取数据时将游标映射到模型,在写入数据时将模型映射到ContentValues.
但是,这种架构感觉非常臃肿.
首先,不可能获得关于电流的可靠信息SyncState(以向用户提供反馈).(现在使用这个SO答案 "黑客攻击" )
第二个问题是我需要的每个资源:模型,映射器,表定义和ContentProvider URI.这只是一个资源管理的代码很多.
第三个问题是通过我的映射器要求模型我阻止自己CursorLoader在活动中使用a .
底线
我正在寻找一种可维护且轻量级的方法来使用Json进行离线内容和与RESTful Web服务的同步.此外,我希望能够在我的代码中使用模型,因为它比开发人员更友好(目前隐藏在我的Mapper类中).user.getName()cursor.getString(cursor.getColumnIndex(UserDataSource.COLUMN_NAME));
关于映射的一个很好的例子是Dapper结合为.NET编写的Dapper Extensions,但与我的方法类似,但是我的方法需要在许多不同的文件中定义所有列和字段(见上文).
另外,我正在考虑放弃ContentProvider我的代码,因为对于这么简单的任务,它感觉非常臃肿和过时.
我目前正在开发一个由主服务器和许多客户端组成的Laravel 4项目.客户端创建数据并将其发送到主服务器.为避免冲突,我使用UUID v4作为主键.
但是,一旦在服务器上创建数据,我想分配一个唯一的自动递增整数,以便用户更容易识别数据.例如:而不是说item 5a8e896d-3ab4-48d2-9d39-faeb5227f012一个用户可以谈论item #24567
为了保持我的应用程序可管理我正在使用迁移,我对此表的当前迁移如下所示:
public function up()
{
Schema::table('items', function($table)
{
$table->create();
$table->string('id')->primary(); //'id' For the purpose of keeping the ORM working, this field stores the UUID.
$table->integer('number', true); //The human readable item number, the second parameter is true for auto-increment
$table->text('otherdata');
$table->timestamps();
});
}
Run Code Online (Sandbox Code Playgroud)
问题是Laravel在定义自动增量时会自动创建主键,因此迁移最终会失败,因为有两个主键.
[Exception] SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key defined
(SQL: alter table `items` add primary key items_id_primary(`id`)) (Bindings: array ())
Run Code Online (Sandbox Code Playgroud)
有没有办法使用Laravel 4迁移使用主键和单独的自动递增字段.
我想在我的CMS中为页面创建自定义slug,因此用户可以创建自己的SEO-urls(如Wordpress).
我以前通过"滥用"404路由在Ruby on Rails和PHP框架中执行此操作.无法找到请求的控制器时调用此路由,使我能够将用户路由到我的动态页面控制器以解析slug(如果没有找到页面,则从我将其重定向到真实404).这样,仅查询数据库以检查所请求的slug.
但是,在MVC中,仅当路由不适合默认路由时才会调用catch-all路由/{controller}/{action}/{id}.
为了仍然能够解析自定义slugs我修改了RouteConfig.cs文件:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
RegisterCustomRoutes(routes);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { Controller = "Pages", Action = "Index", id = UrlParameter.Optional }
);
}
public static void RegisterCustomRoutes(RouteCollection routes)
{
CMSContext db = new CMSContext();
List<Page> pages = db.Pages.ToList();
foreach (Page p in pages)
{
routes.MapRoute(
name: …Run Code Online (Sandbox Code Playgroud)