菜鸟教程小白 发表于 2022-12-12 22:14:24

ios - 从 json 插入核心数据模型


                                            <p><p>我有一项服务可以获取使用以下 json 响应的员工:</p>

<pre><code>[{ &#34;initials&#34;: &#34;PR&#34;, &#34;name&#34;: &#34;Paul&#34;, &#34;accounts&#34;: [&#34;SPA&#34;, &#34;ITA&#34;] },
{ &#34;initials&#34;: &#34;SR&#34;, &#34;name&#34;: &#34;William&#34;, &#34;accounts&#34;: [&#34;ITA&#34;] } ]
</code></pre>

<p>和另一个服务来获取导致这样的 json 的帐户:</p>

<pre><code>[{ &#34;code&#34;: &#34;SPA&#34;, &#34;name&#34;: &#34;Spain&#34;, &#34;employees&#34;: [&#34;PR&#34;]},
{ &#34;code&#34;: &#34;ITA&#34;, &#34;name&#34;: &#34;Italy&#34;, &#34;employees&#34;: [&#34;PR&#34;, &#34;SR&#34;]} ]
</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:@&#34;Accounts&#34; ofType:@&#34;json&#34;];
    NSArray *accounts = options:kNilOptions error:&amp;err];

    [accounts enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) {
      Account *account = ;
      account.code = ;
      account.name = ;
      account.employees = ];
      NSError *error;
      if (!) {
            NSLog(@&#34;Whoops, couldn&#39;t save: %@&#34;, );
      }
    }];
}

- (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]
查看完整版本: ios - 从 json 插入核心数据模型