ios - 无法在 iOS 的核心数据中用另一个实体替换一个实体

标签 ios core-data nsmanagedobject nsmanagedobjectcontext

我正在开发一个 iOS 应用程序,我在其中使用 Core Data 进行存储。在我的商店中,每个实体都是唯一的,我正在构建一个函数,我将一个现有实体替换为我传入的另一个实体。这是我传递的实体的示例:

    NSManagedObjectContext *context = [[MyDB sharedInstance] managedObjectContext];

    User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:context];

    NSNumber *userNumber = 12345;

    user.id = userNumber;
    user.name = @"John Doe";
    user.email = @"john@doe.net";
    user.createdDate = [NSDate date];

    [[MyDB sharedInstance] updateUser:user];

在我的核心数据存储中,我已经有一个相同的实体,除了电子邮件地址是“john@doe.com”。我现在的更新是这样的:

-(void)updateUser:(User *)user {

    NSError *error;
    NSManagedObjectContext *context = [[MyDB sharedInstance] managedObjectContext];

    // Create fetch request
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    // Create predicate
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"id == %@", user.id];
    [fetchRequest setPredicate:pred];

    NSArray *results = [context executeFetchRequest:fetchRequest error:&error];

    if (error) {
        // handle fetch error
    } else {

        user = [[User alloc] initWithEntity:entity insertIntoManagedObjectContext:context];

        for (User *recordToDelete in results) {

            [context deleteObject:recordToDelete];//record gets deleted here, which is fine

        }

        [context save:&error]; //this doesn't save the new entity that I passed in

        if (error) {
            // handle save error
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        }

    }


    [fetchRequest setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id=%@", 12345];
    [fetchRequest setPredicate:pred];

    NSArray *items = [context executeFetchRequest:fetchRequest error:&error];

    for (User *testObject in items) {

        NSLog(@"ID: %@, Name: %@, Email: %@, Created Date: %@", [testObject id], [testObject name], [testObject email], [testObject createdDate]);

    }

}

问题是上面的函数删除了商店中的现有记录,但是,它无法添加替换它的新实体。我该如何纠正这个问题?

最佳答案

还有,我觉得你对NSManagedObjectContext是什么理解的不是很清楚。它类似于内存中的对象缓存。因此,如果您在上下文中创建对象,它就会绑定(bind)到上下文。对象引用了上下文,因此不需要将上下文与对象一起传递 - 可以从中获取对象的上下文。此外,上下文和对象不是线程安全的——您不能在线程之间传递托管对象并在不同线程中使用相同的上下文。相反,您必须:
1) 为每个线程创建上下文
2) 如果你需要在线程之间传递一些东西,从一个线程传递object.objectId,在另一个线程做[context objectWithID:]。它极其快速、高效和安全。

关于ios - 无法在 iOS 的核心数据中用另一个实体替换一个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19038148/

相关文章:

ios - 核心数据获取概念

javascript - WKWebView 弹出窗口未显示

iphone - 使用 Storyboard时单元测试 cellForRowAtIndexPath

iphone - SQLite 中没有数据

iphone - 排除某些对象的多对多关系上的 NSFetchRequest 无法按预期工作

ios - CoreData 关系返回一个 _NSCoreDataTaggedObjectID

ios - 为 NSManagedObject 创建实例但不将其保存到上下文中

ios - 从 TableView 中删除行

ios - 调整 inputAccessoryView 大小时如何解决 "API error: returned 0 width, assuming UIViewNoIntrinsicMetric"?

ios - 核心数据在 swift 中匹配日期