【问题标题】:Core Data: Save unique object ID核心数据:保存唯一的对象 ID
【发布时间】:2011-09-19 00:55:03
【问题描述】:

我看到有一种方法可以获取托管对象的唯一ID:

NSManagedObjectID *moID = [managedObject objectID];

但是,正如我所读到的,它在保存时会发生变化。

有什么更好的方法来创建我自己的唯一 ID 并将其保存在每个对象中,确保它是唯一的并且不会更改?

【问题讨论】:

    标签: iphone objective-c ios core-data nsmanagedobject


    【解决方案1】:

    您不能将 NSManagedObjectID 保存在 CoreData 实体中,并且其中没有可以用作整数或字符串 ID 的属性。 因此,构建自己的唯一标识符算法是一种可接受的解决方案,如果您无法跟踪保存实体的时间,我会为某些应用程序这样做。

    例如我前段时间有一个类似的问题,当我需要用实体的引用填充 UITableView 单元格,并在单击/触摸单元格后检索实体。

    我通过使用 uri 表示找到了一个建议,但是 但是我仍然需要保存之前的上下文,但是我设法使用 NSFetchedResultsController 并找到了一个更可靠的解决方案,而不是应用程序构建的 id .

    [[myManagedObject objectID] URIRepresentation];
    

    然后您可以稍后检索托管对象 id 本身:

    NSManagedObjectID* moid = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]];
    

    并且使用 moid 我可以检索您的托管对象。

    【讨论】:

      【解决方案2】:

      我的对象中有一个 created 日期属性,所以我最终使用了该日期,包括秒数,在我看来,它是独一无二的,可以按照我的意愿工作。

      【讨论】:

      • 这对我来说似乎是一种做事的方式。使用块保存它并有一个指向原始 managedObjectContext 的指针,然后设置服务器端标识要整洁得多。
      • 一个可能出现的问题是,如果您的应用程序的多个实例碰巧同时创建对象(最多第二个),然后这些对象被上传到服务器端,ID 将发生冲突。否则,简单(即使有点快'n'脏)
      【解决方案3】:

      您可以为您的对象创建一个 id 字段,并在 init 期间使用 GUID 填充它。有关如何创建 GUID 并可选择将其导出为字符串,请参阅 UUID (GUID) Support in Cocoa

      【讨论】:

      • 不要使用“id”、“description”等名称调用对象属性
      【解决方案4】:

      如果它帮助其他人搜索这个,我就是这样做的:

      在对象上创建一个 ID 属性

      使用此代码创建对象时获取上次使用的 ID:

      Playlist *latest;
      
      // Define entity to use and set up fetch request
      NSEntityDescription *entity = [NSEntityDescription entityForName:@"Playlist" inManagedObjectContext:managedObjectContext];
      NSFetchRequest *request = [[NSFetchRequest alloc] init];
      [request setEntity:entity];
      
      
      // Define sorting
      NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"listID" ascending:NO];
      NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
      [request setSortDescriptors:sortDescriptors];
      
      
      // Fetch records and handle errors
      NSError *error;
      NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
      
      if (!fetchResults) {
          NSLog(@"ERROR IN FETCHING");
      }
      
      if ([fetchResults count] == 0) {
          latestID = 0;
      } else {
          latest = [fetchResults objectAtIndex:0];
          latestID = latest.listID;
      }
      

      在新对象上将 this 加一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多