更新AppDelegate类中coredata中的特定记录



我想更新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;        
}
}

最新更新