- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在处理 CoreData 中的对象 ID 时遇到问题。为方便起见,我使用 MagicalRecord 并具有 3 个上下文:私有(private)队列工作上下文、UI 的主队列上下文和工作上下文的父级,以及作为主上下文父级的私有(private)队列保存上下文。
我的目标是在工作上下文中创建一个对象,保存到持久存储,将它的 objectID URL 保存到 NSUserDefaults,然后稍后能够使用 objectID 拉出 MO。但是,我发现保存对象的永久 ID 后正在发生变化。
在下面的控制台输出中,您可以看到,在我请求永久 ID 后,我得到的值是“F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p1”,但后来当我列出 CD 中的所有对象时,那里唯一的对象ID 为“F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p2”。 p1 vs p2,发生了什么?
代码:
NSManagedObjectContext *c = [NSManagedObjectContext MR_contextThatPushesChangesToDefaultContext];
[c performBlockAndWait:^{
NSArray *all = [CDBaseAccount MR_findAllInContext:c];
NSLog(@"count: %d", all.count);
NSLog(@"all accounts = %@", all);
CDBaseAccount *a = [CDBaseAccount MR_createInContext:c];
a.accountName = @"foo";
[c MR_saveNestedContexts];
NSLog(@"temp a.objectID = %@", a.objectID);
NSError *error;
if (![c obtainPermanentIDsForObjects:@[a] error:&error]) {
NSLog(@"perm id error: %@", error);
return;
}
NSLog(@"perm a.objectID = %@", a.objectID);
NSURL *u = a.objectID.URIRepresentation;
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *d = [NSManagedObjectContext MR_defaultContext];
NSArray *all = [CDBaseAccount MR_findAllInContext:d];
NSLog(@"count: %d", all.count);
NSLog(@"all accounts = %@", all);
NSManagedObjectID *i = [d.persistentStoreCoordinator managedObjectIDForURIRepresentation:u];
NSError *objWithIdError = nil;
NSManagedObject *o = [d existingObjectWithID:i error:&objWithIdError];
if (objWithIdError != nil) {
NSLog(@"existing object error: %@", objWithIdError);
return;
}
NSLog(@"o = %@", o);
NSLog(@"o.objectID = %@", o.objectID);
});
}];
> +[NSManagedObjectContext(MagicalRecord) MR_contextWithStoreCoordinator:](0xa7c9b0) -> Created <NSManagedObjectContext: 0x83522a0>: Context *** MAIN THREAD ***
> count: 0
> all accounts = (
> )
> -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x8353de0) -> Saving <NSManagedObjectContext: 0x8353de0>: Context *** MAIN THREAD ***
> -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x8195450) -> Saving <NSManagedObjectContext: 0x8195450>: *** DEFAULT *** Context *** MAIN THREAD ***
> -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x83522a0) -> Saving <NSManagedObjectContext: 0x83522a0>: *** BACKGROUND SAVE *** Context *** MAIN THREAD ***
> temp a.objectID = 0x8187ee0 <x-coredata:///CDBaseAccount/tF392AC6A-3539-4F39-AC53-35F9E5B3C9322>
> perm a.objectID = 0x8355800 <x-coredata://F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p2>
> count: 1
> all accounts = (
"<CDBaseAccount: 0x844ca60> (entity: CDBaseAccount; id: 0x844a4c0 <x-coredata://F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p1> ; data: <fault>)"
)
> existing object error: Error Domain=NSCocoaErrorDomain Code=133000 "The operation couldn’t be completed. (Cocoa error 133000.)" UserInfo=0x864d8c0 {NSAffectedObjectsErrorKey=(
"<CDBaseAccount: 0x864b8c0> (entity: CDBaseAccount; id: 0x86405c0 <x-coredata://F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p2> ; data: <fault>)"
)}
最佳答案
简短的回答是,不要那样做:)-objectID
在您的应用程序启动之间不可靠。在以下条件下保证其唯一性和可靠性:
-objectID
作为要存储在持久存储之外的永久唯一标识符,您会经常失败。 Core Data 更改了
-objectID
的底层细节在对象的生命周期中多次。
[[NSProcessInfo processInfo] globallyUniqueString]
任何需要外部引用唯一的实体。
-awakeFromInsert
是这样做的好地方。
关于core-data - 永久 NSManagedObjectID 不是那么永久吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12218396/
NSManagedObjectId 实例本身能否在线程之间安全共享?我知道我可以降低一个级别并获取它的 URIRepresentation,但如果我能避免的话,我会的。 谢谢! 最佳答案 是的,是的。
我想将 iPhone 上的核心数据与 Sinatra 服务器上的 MongoDB 同步。 当 iPhone 从 Node.js 聊天服务器收到一条消息时,该消息包含发件人的 BSON ObjectId
为避免成为 XY 问题,这里有一些背景: 我的应用程序允许用户创建和保存很多设置,有点像 Xcode 的字体和颜色选择器: 这是因为用户可以设置的东西很多。只需点击保存的设置而不是重新设置所有这些设置
我发现了这个美妙的 NSManagedObjectID。这对于引用 Entity/NSManagedObject/NSEntityDescription 非常有用,对吗? 让我们从实体获取 ID: N
我有一个名为 HomeTableViewController 的 TableViewController,它加载了来自 Core Data 数组的数据。我试图从选定的单元格中获取对象 ID,如下所示:
我有一个弱属性: @property (nonatomic,weak) NSManagedObjectID *locatedMessageID; 调用 -(void)setLocatedMessage
我不太确定这个问题的格式是否适合这个网站。 基本上,有谁知道是什么让 Apple 做出这样的设计决定,即每当您将数据保存到持久存储时 NSManagedObjectID 都会发生变化? 我可能是错的,
我有一个核心数据实体需要保留一些其他实体的 NSManagedObjectID。为此,我正在考虑将 ObjectID 转换为字符串,该字符串是 NSManagedObject 属性的批准类型。 我可以
在我的应用程序中,我将 Core Data 与不使用 Core Data 的附加 sqlite 数据库一起使用。在这个额外的数据库中,我有一些列通过每个实例的 NSManagedObjectID 存储
我在处理 CoreData 中的对象 ID 时遇到问题。为方便起见,我使用 MagicalRecord 并具有 3 个上下文:私有(private)队列工作上下文、UI 的主队列上下文和工作上下文的父
目前,我通过以下代码执行多个更新操作。 func updateOrders(_ updates : [(objectID: NSManagedObjectID, order: Int64)]) {
我保存了我的托管对象。但是我的NSManagedObjectID保存后还是临时的。为什么? dispatch_async(privateQueue, ^{ __block NSMutableA
代码如下: - (void)willTurnIntoFault { NSManagedObject *relatedObject = self.relatedObject; if (r
我有一个 NSManagedObjectID 数组。有没有比遍历数组并单独获取它们更有效的方法来获取关联的托管对象? 最佳答案 使用以下谓词执行fetchRequest NSPredicate *pr
我真的很想避免使用 NSManagedObjectID作为将我的模型结构连接到它们的 CoreData 对象的一种方式。我的意思是这样的: 假设我有一个 Book CoreData 中的实体,然后我有
我正在开发一个使用 CoreData 的应用程序。出于我的应用程序的目的,我想保存一个对象的 managedObjectId(在 plist 文件中),以便在下次应用程序启动时检索该对象。 经过一些研
我看到了这个答案,这确实是我需要的(Does a Core Data NSSet contain an object with a certain ID?),但是其中使用的 ID 是用户自定义的 ID
我在 UICollectionviewController 中显示了一个数据集,我使用 [fetchedResultsController objectAtIndexPath:indexPath] 访
我有一个 xcdatamodel,其中包含一组内置于静态库中的实体。 我将这个静态库包含在一个项目中。我想在主项目中创建另一个模型,实体名为 Task。我想在实体中有一个属性,我可以在其中存储在静态库
我正在编写一个连接到数据库以获取数据的应用程序。由于获取成本高昂且数据通常不会改变,因此我使用 CoreData 来缓存结果,以便可以进行快速的本地查询。 从数据库中,对于每种类型,都有一个保证唯一的
我是一名优秀的程序员,十分优秀!