【问题标题】:NSManagedObjectContext objectWithId not returning an object despite valid objectIdNSManagedObjectContext objectWithId 不返回对象,尽管 objectId 有效
【发布时间】:2013-04-04 21:59:52
【问题描述】:

我有一个持久存储的核心数据结构 主线程上下文 私有线程上下文(用作暂存器)。

我的用户在“私有线程”/便笺上下文中创建和配置杂志对象后按“保存”。

我从主线程上下文中获取当前登录的帐户,因为要创建的新杂志必须分配一个帐户。

Account* accountForMagazine = [self.accountsConnector getSelectedAccount];
NSLog(@"object id: %@",accountForMagazine.objectID);

对象id NSLog 输出为:

0xa677790 <x-coredata://F635CE5A-C335-48F0-BB27-61B7D9XXXXD8/Account/p4>

所以它是一个永久 id,它告诉我该对象在持久存储中。

然后我切换到私有线程(databaseConnector 只是私有线程上托管对象上下文的包装器)并尝试将该帐户对象带到线程上,以便可以将其分配给将要执行的杂志对象得救。

[self.databaseConnector executeOnCorrectThread:^
{
    Account* account = (Account*)[self.databaseConnector.getContext objectWithID:accountForMagazine.objectID];
    self.magazine.account = account;
    if(!account) { NSLog(@"nil account"); }
    [self.databaseConnector save];
}

我遇到的问题是,虽然新杂志对象正在保存并进入持久存储,但它们都没有连接到帐户!当然,每次都会显示 NSLog 语句 - 表示该线程上的帐户对象为 nil。

因此,即使我有一个有效的 objectId,因此该对象存在于持久存储中,我也没有通过 objectWithId 在私有线程上获取帐户对象。

有什么想法吗?

谢谢

Vb

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    里面有nil,你没想到会是nil

    原因如下:objectWithID: 总是 返回一个对象。但是你得到nil。最可能的原因是 self.databaseConnector.getContext 实际上在该块中返回 nilaccountForMagazine 可能是也是 nil,但如果这是唯一意外的nil,那么您的应用程序将会崩溃(无法将nil 传递给该方法并继续运行)。

    【讨论】:

    • 我认为你在这里做了一些事情,因为 objectWithID: 如果具有给定 ID 的对象不存在,应该抛出异常。
    猜你喜欢
    • 2020-07-25
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多