我想更新AppDelegate类中coredata中的特定记录。但没有成功。在其他自定义类中,它非常完美,但我认为这里有一些NSManagedObjectContext问题,但不知道,很难解决。
这是我的密码。
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Reminder" inManagedObjectContext:managedObjectContext]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(uniqueId=%@)",uid];
request.predicate = predicate;
request.resultType=NSDictionaryResultType;
[request setReturnsObjectsAsFaults:NO];
NSError *err=nil;
NSArray *result = [managedObjectContext executeFetchRequest:request error:&err];
NSManagedObject* object = [result objectAtIndex:0];
[object setValue:@"Previous" forKey:@"reminder_for"];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"error%@",error.description);
}
else
{
NSLog(@"Update record");
}
请帮忙。
使用NSDictionaryResultType
时,您将收到一个NSDictionary
数组,而不是NSManagedObject
数组。由于resultType
默认为NSManagedObjectResultType
,所以不要设置它
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Reminder"];
request.predicate = [NSPredicate predicateWithFormat:@"uniqueId == %@", uid];
request.returnsObjectsAsFaults = NO;
NSError *error;
NSArray *result = [managedObjectContext executeFetchRequest:request error:&error];
NSManagedObject *object = result.firstObject;
[object setValue:@"Previous" forKey:@"reminder_for"];
if (![managedObjectContext save:&error]) {
NSLog(@"error%@",error.description);
} else {
NSLog(@"Update record");
}
尝试下面的代码可能会对您有所帮助。
在appDelegate类中添加这些属性
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContextForBackgroundWriter;
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContextForMainThread;
static NSString * const MP_PERTHREADKEY_MOC = @"MPPerThreadManagedObjectContext";
在appDelegate类中添加以下方法
- (NSManagedObjectContext *)managedObjectContextForBackgroundWriter
{
@synchronized(self) {
if (!_managedObjectContextForBackgroundWriter) {
_managedObjectContextForBackgroundWriter = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_managedObjectContextForBackgroundWriter setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
}
}
return _managedObjectContextForBackgroundWriter;
}
- (NSManagedObjectContext *)managedObjectContextForMainThread
{
@synchronized(self) {
if (!_managedObjectContextForMainThread) {
_managedObjectContextForMainThread = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_managedObjectContextForMainThread.parentContext = [self managedObjectContextForBackgroundWriter];
}
}
return _managedObjectContextForMainThread;
}
更改managedObjectContext方法
- (NSManagedObjectContext *)managedObjectContext
{
if ([NSThread isMainThread]) {
return [self managedObjectContextForMainThread];
} else {
NSThread *currentThread = [NSThread currentThread];
NSMutableDictionary *threadDictionary = [currentThread threadDictionary];
NSManagedObjectContext *managedObjectContextForCurrentThread = [threadDictionary objectForKey:MP_PERTHREADKEY_MOC];
if (managedObjectContextForCurrentThread == nil) {
managedObjectContextForCurrentThread = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
managedObjectContextForCurrentThread.parentContext = [self managedObjectContextForMainThread];
[threadDictionary setObject:managedObjectContextForCurrentThread forKey:MP_PERTHREADKEY_MOC];
}
return managedObjectContextForCurrentThread;
}
}