[aerogear-dev] iOS/CoreData - API proposal - AGEntityMapper
Christos Vasilakis
cvasilak at gmail.com
Fri Jan 4 07:52:38 EST 2013
nice!
passing the object mappings (which will account for attributesFor* inside the lib) as required by the AFIncrementalStore in the config object makes perfectly sense to me.
+1
-
Christos
On Jan 4, 2013, at 12:55 PM, Matthias Wessendorf <matzew at apache.org> wrote:
> CoreData: API proposal - AGEntityMapper
> Background
> Mapping JSON representations to a "rich" domain model in ObjC is a bit cumbersome. Similar is true when mapping a JSON data/response to a NSMangedObject (and vise versa). There is a base framework for "remote persistence", via the CoreData API, by leveraging a custom NSIncrementalStore -> AFIncrementalStore.
>
> For that,... a similar two-way-mapping is required, as described here.
>
> AeroGear and CoreData
> Our CoreData offerings are leveraging the AFIncrementalStore, therefore (as with other frameworks/libraries) we need a mapping as well. We need to know the name of the entity and we need a NSDictionary that covers the actual JSON/property mapping. It could be done with the vanialla ObjC classes:
>
> // some mappers:
> NSDictionary *task_mapper =
> [NSDictionary dictionaryWithObjectsAndKeys:@"description",@"desc",@"id",@"myId", nil];
> NSDictionary *project_mapper =
> [NSDictionary dictionaryWithObjectsAndKeys:@"id",@"myId", nil];
>
> // create a schema out of the mappers:
> NSDictionary *schema =
> [NSDictionary dictionaryWithObjectsAndKeys:task_mapper, @"Task", project_mapper, @"Project", nil];
>
> // pass the schema to the AGCoreDataHelper class, when doing the init...
> Proposal for a custom API
> I'd like to introduce a new wrapper type, called AGEntityMapper:
>
> @interface AGEnityMapper : NSObject
>
> @property NSString *name;
> @property NSDictionary *mapper;
>
> -(id) initWithName:(NSString *) name mapper:(NSDictionary *) mapper;
> @end
> This AGEntityMapper would be applied onto the AGCoreDataConfig:
>
> @protocol AGCoreDataConfig <NSObject>
>
> @property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
> @property (strong, nonatomic) NSURL *baseURL;
>
> -(void)applyEntityMappers:(AGEnityMapper *)firstObject, ... NS_REQUIRES_NIL_TERMINATION;
>
> @end
> The actual code, would look like this:
>
> EnityMapper *taskMapper =
> [[EnityMapper alloc] initWithName:@"Task"
> // mapping the properties on the "entity" (NSManagedObject)
> // to the external representation (e.g. JSON)
> mapper:@{ @"desc": @"description", @"myId": @"id"}];
>
> EnityMapper *projectMapper =
> [[EnityMapper alloc] initWithName:@"Project"
> // mapping the properties on the "entity" (NSManagedObject)
> // to the external representation (e.g. JSON)
> mapper:@{ @"myId": @"id"}];
>
> AGCoreDataHelper *helper = [[AGCoreDataHelper alloc] initWithConfig:^(id<AGCoreDataConfig> config) {
>
> [config setBaseURL:[NSURL URLWithString:@"http://server.com"]];
>
> [config applyEntityMappers:
> taskMapper,
> projectMapper,
> nil // terminate the varargs.
> ];
> }];
>
> --
> Matthias Wessendorf
>
> blog: http://matthiaswessendorf.wordpress.com/
> sessions: http://www.slideshare.net/mwessendorf
> twitter: http://twitter.com/mwessendorf
> _______________________________________________
> aerogear-dev mailing list
> aerogear-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/aerogear-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/aerogear-dev/attachments/20130104/cf0feecc/attachment-0001.html
More information about the aerogear-dev
mailing list