1. 运用 state 参数 + Notification 以同步保存数据的过程, 因为保存entity是有时间的。例如避免拿到 temporary Id (临时ld)而你可能想得到的是real objectId。 正确的做法是利用Notification监听,保存完毕后更改state进行下一步 (这时候已经确定是 real id)。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(objectContextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:nil;
- (void)objectContextDidSave:(NSNotification*)notification
{
switch (_currentState) {
case kState1:
{
break;
}
case kState2:
{
break;
}
default:
break;
}
}
2. Entity Model,合理利用 Abstract Entity (图中的 DrawEntityBase),其他 Entities 设其为 parent entity。
3. 合理利用Entity的 ObjectId。(先要确保不是临时ID - temporary id)。利用 ObjectId 关联数据表,查询上下表数据,这样就不需要自己生成id列。
4. 查询数据的一般方法, 根据要查询的列数据(searchId)搜索并返回按创建时间(createdOn 列)排序后的所有(EntityName表格里的)数据。
+(NSArray*)fetchXXXXXDataForSearchId:(NSString*)searchId
{
ManagedObjectContext *managedObjectContext = xxxx; // get from your AppDelegate
__autoreleasing NSError *error = nil;
NSArray *result = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"entity.xxxId == %@" argumentArray:@[searchId]]];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"createdOn" ascending:YES]]; // sort by created time
result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"Fatal - Core data error %@",error);
abort();
}
return result;
}