在 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) 中保存数据时出错的主要内容,如果未能解决你的问题,请参考以下文章
保存在 Core Data 中的 iOS 数据在启动后无法保存
将可转换的 NSAttributedString 保存到 Core Data 时出现异常奇怪的崩溃