ios - 从 json 插入核心数据模型
<p><p>我有一项服务可以获取使用以下 json 响应的员工:</p>
<pre><code>[{ "initials": "PR", "name": "Paul", "accounts": ["SPA", "ITA"] },
{ "initials": "SR", "name": "William", "accounts": ["ITA"] } ]
</code></pre>
<p>和另一个服务来获取导致这样的 json 的帐户:</p>
<pre><code>[{ "code": "SPA", "name": "Spain", "employees": ["PR"]},
{ "code": "ITA", "name": "Italy", "employees": ["PR", "SR"]} ]
</code></pre>
<p>我需要解析接收到的信息并将其插入到核心数据数据库中,该数据库具有两个核心数据模型,员工和帐户,声明了多对多的关系。它们声明如下:</p>
<pre><code>@interface Employee : NSManagedObject
@property (nonatomic, retain) NSString *initials;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *accounts;
@end
@interface Account : NSManagedObject
@property (nonatomic, retain) NSString *code;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *employees;
@end
</code></pre>
<p>我现在做的是先插入员工,然后创建每个帐户并查询要插入每个帐户的员工。显然,这样做的性能非常糟糕,因为我需要为每个帐户做一个请求。</p>
<pre><code>- (void)loadEmployeesJSON { ... }
- (void)loadAccountsJSON {
NSManagedObjectContext *context = self.managedObjectContext;
NSError *err = nil;
NSString *dataPath = [ pathForResource:@"Accounts" ofType:@"json"];
NSArray *accounts = options:kNilOptions error:&err];
[accounts enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) {
Account *account = ;
account.code = ;
account.name = ;
account.employees = ];
NSError *error;
if (!) {
NSLog(@"Whoops, couldn't save: %@", );
}
}];
}
- (NSSet*)accountsForEmployee:(NSArray*)initialsArray {
NSManagedObjectContext *context = self.managedObjectContext;
NSError *error = nil;
NSFetchRequest *fetchRequest = [ init];
NSEntityDescription *entity = ;
];
;
NSArray *fetchedObjects = ;
return ;
}
</code></pre>
<p>如何在不要求每个帐户的员工的情况下链接它们?
我认为我可以在内存中映射所有员工并要求他们。但是,如果我的员工数据库太大(+100.000)而无法存储在内存中怎么办?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>无论大小有多大,您都可以将所有员工都保存在内存中。为此,在您创建员工实体并保存它(最好是批量保存)后,通过以下方式将它们重置为故障:</p>
<pre><code>NSManagedObjectContext *moc = ...;
NSManagedObject *employee = ...;
;
</code></pre>
<p>通过在保存后调用 <code>-refreshObject:mergeChanges:</code>,它将将该对象的属性和关系从内存中删除,并将其内存占用减少到接近于零。从那里您可以将其存储在 <code>NSDictionary</code> 中以供以后进行关系映射。</p>
<p>这将避免所有的提取并显着提高您的导入性能。</p></p>
<p style="font-size: 20px;">关于ios - 从 json 插入核心数据模型,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/23523400/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/23523400/
</a>
</p>
页:
[1]