2015-09-21 68 views
0

我的程序從Web服務接收JSON數據。接下來,程序使用核心數據將數據存儲在數據庫中。如果我在添加每個條目後調用保存數據,則一切正常,但非常緩慢。保持200條記錄需要一分多鐘。將數據保存在覈心數據(IOS)中時出錯

如果我在最後只執行一次保存 - 程序拋出異常。

- (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; 
} 

幫助正確的程序的行爲。

尊重, 亞歷山大。

P.S. 執行發生在主線程中。

索引表「消息」的字段「Id」。

+0

您有哪些異常? – Andrey

+0

線程1:信號SIGABRT 和粉碎應用:( – alisichkin

回答

0

我通過添加privateObjectContext來解決問題!

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

在更新/插入數據時替換privateObjectContext上的managedObjectContext/