在 Core Data (IOS) 中保存数据时出错

Posted

技术标签:

【中文标题】在 Core Data (IOS) 中保存数据时出错【英文标题】:Error saving data in Core Data (IOS) 【发布时间】:2015-09-21 12:58:33 【问题描述】:

我的程序从 Web 服务接收 JSON 数据。接下来,程序使用 Core Data 将数据存储在数据库中。如果我在添加每个条目后调用保存数据,一切正常,但速度很慢。保存 200 个条目需要一分钟以上的时间。

如果我最后只执行一次保存——程序会抛出异常。

- (void) onLoadMessages:(NSObject*)object   
    NSArray *messages = (NSArray*)object;  
    if (messages==nil)   
        [self onError:@"Message array is null"];  
        return;  
      

    NSDate *date = [NSDate date];  
    long now = [date timeIntervalSince1970];  
    Boolean update = false;  
    for(int i=0; i<messages.count; i++)   
        NSDictionary *m = messages[i];  
        Message *msg = [[Message alloc]initWithDictionary:m];  
        if ([self UpdateMessage:msg UpdateTime:now])  
            update = true;  
      
    if (update)   
        NSError *error = nil;  
        // Error throw here  
        if (![self.managedObjectContext save:&error])  
            [self onError2:error];  
      
  

- (Boolean) UpdateMessage:(Message*) msg UpdateTime:(long)now   
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];  
    // Edit the entity name as appropriate.  
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Messages" inManagedObjectContext:self.managedObjectContext];  
    [fetchRequest setEntity:entity];  

    NSString *s = [NSString stringWithFormat:@"%ld", msg.id];  
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(id=%@)", s];  
    [fetchRequest setPredicate:pred];  

    NSError *error;  
    NSArray *object = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];  

    Boolean result = false;  
    if (object==nil)  
        [self onError2:error];  
    else   
        NSManagedObject *m;  
        if ([object count]==0)   
            // Insert new message  
            m = [NSEntityDescription insertNewObjectForEntityForName:@"Messages"  
                                              inManagedObjectContext:self.managedObjectContext];  
            [m setValue:[NSNumber numberWithLong:msg.id] forKey:@"id"];  
            [m setValue:[NSNumber numberWithLong:msg.agancy.id] forKey:@"agancy"];  
            [m setValue:msg.header forKey:@"header"];  
            [m setValue:msg.keywords forKey:@"keywords"];  
            [m setValue:[NSNumber numberWithLong:msg.indate] forKey:@"indate"];  
            [m setValue:[NSNumber numberWithLong:now] forKey:@"updated"];  
            result = true;  
       else   
            // Update message  
            m = [object objectAtIndex:0];  
            [m setValue:[NSNumber numberWithLong:now] forKey:@"updated"];  
          

        // Save the context.  
        // Too long execution  
        /*NSError *error = nil; 
        if (![self.managedObjectContext save:&error]) 
            [self onError2:error];*/  

      
    return result;  
  

帮助纠正程序的行为。

尊敬的, 亚历山大。

附: 执行发生在主线程中。

索引表“消息”的字段“ID”。

【问题讨论】:

你到底有哪个例外? 线程1:信号SIGABRT和crush应用:( 【参考方案1】:

我通过添加privateObjectContext来解决问题!

_privateObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

并在更新/插入数据时替换 privateObjectContext 上的 managedObjectContext/

【讨论】:

以上是关于在 Core Data (IOS) 中保存数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

iOS 后台保存在 Core Data 中

保存在 Core Data 中的 iOS 数据在启动后无法保存

将可转换的 NSAttributedString 保存到 Core Data 时出现异常奇怪的崩溃

在 iOS 中对来自 Core Data 的实体的 NSArray 进行快速枚举时出现运行时错误

ios Core Data - 我的保存按钮不起作用

iOS Core Data 保存上下文错误