NSManagedObjectID 到 NSData

发布于 2024-07-13 01:29:02 字数 490 浏览 5 评论 0原文

我发现了这个美妙的 NSManagedObjectID。 这对于引用 Entity/NSManagedObject/NSEntityDescription 非常有用,对吧?
让我们从实体中获取 ID:

NSEntityDescription *entity = [self newEntity];     
NSManagedObjectID *objID = [entity objectID];

那么...知道如何将此 objID 转换为字符串吗? 或者更好:NSData。 实际上可以将其保存到 NSUserDefaults 中。 ;-)

顺便说一句: NSFetchRequest 不想在我的情况下工作。 我使用此示例的修改版本:旧问题的答案

I found this wonderful NSManagedObjectID. This would be very good for referencing an Entity/NSManagedObject/NSEntityDescription, right?
Let's get an ID from an entity:

NSEntityDescription *entity = [self newEntity];     
NSManagedObjectID *objID = [entity objectID];

So... any idea how to get this objID into a string? Or better: NSData. Actually something to be able to save it to the NSUserDefaults. ;-)

Btw: NSFetchRequest doesn't want to work in my case. I use an modified version of this example: answer of an old question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

单挑你×的.吻 2024-07-20 01:29:03

要获取与 NSManagedObjectobjectID 对应的存档 URI:

NSManagedObject* myMO;
...
NSURL *uri = [[myMO objectID] URIRepresentation];
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri];

为了返回原始托管对象的实例,您需要一个具有持久存储的 CoreData 堆栈将该实例已添加NSPersistentStoreCoordinator。 然后:

NSData *uriData;
NSPersistentStoreCoordinator *psc;
NSManagedObjectContext *moc; //with moc.persistentStoreCoordinator = psc.
...
NSURL *uri = [NSKeyedUnarchiver unarchiveObjectWithData:uriData];
NSManagedObjectID *moID = [psc managedObjectIDForURIRepresentation:uri];
NSManagedObject *myMO = [moc objectWithID:moID];

To get an archived URI corresponding to a NSManagedObject's objectID:

NSManagedObject* myMO;
...
NSURL *uri = [[myMO objectID] URIRepresentation];
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri];

In order to get back to an instance of the original managed object, you need a CoreData stack with the persistent store holding that instance already added to the NSPersistentStoreCoordinator. Then:

NSData *uriData;
NSPersistentStoreCoordinator *psc;
NSManagedObjectContext *moc; //with moc.persistentStoreCoordinator = psc.
...
NSURL *uri = [NSKeyedUnarchiver unarchiveObjectWithData:uriData];
NSManagedObjectID *moID = [psc managedObjectIDForURIRepresentation:uri];
NSManagedObject *myMO = [moc objectWithID:moID];
趁年轻赶紧闹 2024-07-20 01:29:03

来自 NSManagedObjectID 文档

对象 ID 可以转换为
URI 表示可以是
存档并稍后重新创建以供参考
回到给定的对象(使用
URIRepresentation 的托管对象 ID:
(NSPersistentStoreCoordinator)和
对象ID:
(NSManagedObjectContext)。 例如,
最后选择的组
应用程序可以存储在
用户默认通过组
对象的 ID。 您还可以使用对象
用于存储“弱”的 ID URI 表示
持久存储之间的关系
(其中不可能有硬连接)。

只需将其转换为 URL,然后将其转换为字符串或数据即可。

From the NSManagedObjectID documentation:

Object IDs can be transformed into a
URI representation which can be
archived and recreated later to refer
back to a given object (using
managedObjectIDForURIRepresentation:
(NSPersistentStoreCoordinator) and
objectWithID:
(NSManagedObjectContext). For example,
the last selected group in an
application could be stored in the
user defaults through the group
object’s ID. You can also use object
ID URI representations to store “weak”
relationships across persistent stores
(where no hard join is possible).

Just turn it into a URL then turn that into a string or a data.

上课铃就是安魂曲 2024-07-20 01:29:03

您是否查看过 URI 表示? 将 NSURL 转换为 NSString 以及 NSData 很容易。

Did you look at URIRepresentation? It's easy to convert an NSURL to an NSString, and that to an NSData.

虚拟世界 2024-07-20 01:29:03

归档前不需要将 NSURL 转换为 NSString。 只需存档 NSURL 即可。

编辑:我最近了解到对象的 ID 可以更改,例如在迁移之后。 因此,将 ID 保存到磁盘并期望稍后能够引用该对象似乎不是一个好主意。

You don't need to convert the NSURL into an NSString before archiving. Just archive the NSURL.

Edit: I've recently learned that an object's ID can change, such as after a migration. It therefore seems like not a good idea to save an ID to disk expecting to be able to reference the object later.

柒七 2024-07-20 01:29:03

这是我目前发现的最干净、最短的方法,使用 4.0 中添加的 setURLgetURL 方法来避免对 NSKeyedUnarchiver 的额外调用> 和 NSKeyedArchiver

Setter:

 + (void)storeSomeObjectId:(NSManagedObjectID *)objectId
 {
     [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] 
                                            forKey:@"someObjectIdKey"];
     [[NSUserDefaults standardUserDefaults] synchronize];
 }

Getter:

 + (SomeManagedObject *)getObjectByStoredId
 {
     NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"];
     NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
     SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId];
 }

Here's the cleanest and shortest way I've found to do this currently, using the setURL and getURL methods added in 4.0 to avoid extra calls to NSKeyedUnarchiver and NSKeyedArchiver:

Setter:

 + (void)storeSomeObjectId:(NSManagedObjectID *)objectId
 {
     [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] 
                                            forKey:@"someObjectIdKey"];
     [[NSUserDefaults standardUserDefaults] synchronize];
 }

Getter:

 + (SomeManagedObject *)getObjectByStoredId
 {
     NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"];
     NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
     SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId];
 }
您的好友蓝忘机已上羡 2024-07-20 01:29:03

正如@preston所说,不要将 objectID 保存到磁盘,而是:

  1. 在您的实体上创建一个名为“id”的新属性
  2. 在您的实体父实体上创建一个名为“myEntitysMaxId”的新属性
  3. 覆盖您的实体父实现“addNewMyEntityObject:
  4. ” ,增加“myEntitysMaxId”并将该值设置为新实体“id”
  5. 按照您根据属性获取实体时通常执行的操作!

更干净、更好!

As @preston said, don't save an objectID to disk, instead:

  1. Make a new attribute on your entity called "id"
  2. Make a new attribute on your entitys parent entity called "myEntitysMaxId"
  3. Override your entitys parent implementation "addNewMyEntityObject:"
  4. There, increase "myEntitysMaxId" and set that value as the new entitys "id"
  5. Do as you normally do when you fetch an entity based on its attributes!

Much cleaner and better!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文