首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在iOS中的核心数据中替换一个实体

无法在iOS中的核心数据中替换一个实体
EN

Stack Overflow用户
提问于 2013-09-26 20:32:18
回答 2查看 758关注 0票数 0

我正在开发一个iOS应用程序,在这个应用程序中,我使用核心数据进行存储。在我的商店里,每一个实体都是独一无二的,我正在构建一个函数,用我传入的另一个实体替换一个现有实体。下面是我传递的一个实体的示例:

代码语言:javascript
运行
复制
    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“。我现在的最新消息如下:

代码语言:javascript
运行
复制
-(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]);

    }

}

问题是上面的函数删除了存储中的现有记录,但是它无法添加替换它的新实体。我该怎么纠正呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 20:39:53

您没有对托管对象上下文调用save方法。调用正在创建新对象的managedObjectContext上的保存方法。[managedObjectContext save:nil];

记录的方式是。第一个fetch对象取决于编号,然后删除它。然后创建托管对象。最后,请在上下文中保存。

票数 1
EN

Stack Overflow用户

发布于 2013-09-26 21:09:34

而且,我认为您不清楚什么是NSManagedObjectContext。有点像内存中的对象缓存。因此,如果在上下文中创建对象,则它与上下文相关联。对象具有对上下文的引用,因此通过对象传递上下文是不必要的--对象的上下文可以从上下文中获得。另外,上下文和对象不是线程安全的--您不能在线程之间传递托管对象,并且在不同的线程中使用相同的上下文。相反,你必须:

1)为每个线程创建上下文

2)如果需要在线程之间传递某些内容,则从一个线程传递object.objectId,在另一个线程中传递[context objectWithID:]。它非常快速,高效,安全。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19038148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档