核心数据:保存唯一对象ID

时间:2011-09-19 00:55:04

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

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

NSManagedObjectID *moID = [managedObject objectID];

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

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

4 个答案:

答案 0 :(得分:14)

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

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

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

[[myManagedObject objectID] URIRepresentation];

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

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

使用模型,我可以检索您的托管对象。

答案 1 :(得分:5)

我在我的对象中有一个创建的日期属性,所以我最终使用了包括秒的日期,在我看来它似乎是独一无二的,并且按照我想要的方式工作。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

在对象上创建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;
}

在新对象上增加一个。