gpt4 book ai didi

ruby-on-rails - 核心数据 : import a tree structure with find or insert/duplicate entries

转载 作者:可可西里 更新时间:2023-11-01 05:47:03 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com