- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 Rails 应用程序中的位置列表,我正试图将其导入 iOS5 应用程序。每个 Place 都有一个父级,即 Place 本身。
我正在尝试使用字典将 JSON 数据与核心数据一起导入
- (void)initWithDictionary:(NSDictionary *)dictionary {
self.placeId = [dictionary valueForKey:@"id"];
id parent = [dictionary objectForKey:@"parent"];
if (parent && parent != [NSNull null]) {
NSDictionary *parentDictionary = parent;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"placeId = %@", [parentDictionary objectForKey:@"id"]];
NSArray *matching = fetchedWithPredicate(@"Place", self.managedObjectContext, predicate, nil);
if ([matching count] > 0) {
self.parent = [matching objectAtIndex:0];
} else {
self.parent = [NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:self.managedObjectContext];
[self.parent initWithDictionary:parentDictionary];
}
}
}
fetchedWithPredicate 是这样定义的方法
NSArray* fetchedWithPredicate(NSString *entityName, NSManagedObjectContext *context, NSPredicate *predicate, NSError **error) {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setIncludesPendingChanges:YES];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[request setEntity:entity];
[request setPredicate:predicate];
NSArray *result = [context executeFetchRequest:request error:error];
return result;
}
我在 Place.m 中也有一个验证方法,以确保我不会使用相同的 placeId(placeId 是服务器端的 id)创建放置。
- (BOOL)validatePlaceId:(id *)value error:(NSError **)error {
if (*value == nil)
return YES;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"placeId = %@ AND (NOT self IN %@)", *value, [NSArray arrayWithObject:self]];
NSArray *matching = fetchedWithPredicate(@"Place", self.managedObjectContext, predicate, error);
if ([matching count] > 0) {
return NO;
}
else {
return YES;
}
}
为了导入数据,我从服务器获取所有位置,以 JSON 格式返回。每个 Place 都有自己的信息,加上一个包含父节点信息的子节点,这意味着多个子节点的每个父节点都会出现多次。看起来像
{ "id": 73,
"name": "Some place",
"parent": { "id": 2,
"name": "Parent's name"}
}
我认为上面的代码执行某种“查找或创建”操作,其中包含未保存的更改,这样就可以了。但它仍然会尝试为某些地方创建多个条目(并且由于存在验证而失败)。再往深看,确实是为同一个placeId(不同的指针)插入了不同的核心数据对象,但不知道为什么。
谢谢
最佳答案
听起来您已经有一个关于 id 的唯一索引(这显然很好)。我认为这是因为在期望通过提取返回新插入的创建之前,您没有将其保存到核心数据中。简单的(如果可能不是太高效取决于有很多行)是在插入/初始化每个对象后立即添加一个 saveContext
调用。
另一种方法是分两次完成,首先完全在内存中创建一个单独的字典,其中键是 id,对象是值。这样你就可以确保每个 id 只在那里一次。在它们都在该字典中之后,您就可以轻松(或者更容易)将它们全部添加到核心数据中。
关于ruby-on-rails - 核心数据 : import a tree structure with find or insert/duplicate entries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9564355/
我是一名优秀的程序员,十分优秀!