在iPhone上为Core Data程序创建唯一ID

57 iphone cocoa-touch core-data

我在弄清楚这个核心数据的东西时遇到了一些麻烦.如何创建具有唯一ID的新条目?在SQL中,我只将一个字段声明为自动增量字段.我在这里没有看到类似的东西,但我可能会遗漏一些东西.我只想要一个自动递增的NSInteger字段,所以当我手动将项添加到数据库时,我会有一些形式的引用.

use*_*764 148

虽然我同意你所说的,核心数据背后有一个ID机制.ID确实由Core-Data管理,但您可以使用以下命令检索它们:

NSManagedObjectID *moID = [managedObject objectID];
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅: 核心数据编程指南

  • 令人遗憾的是,提问者从未接受过如此精彩的答案. (24认同)
  • 请注意,objectID可以并且确实会发生更改,尤其是在发生迁移时.不要依赖该值在应用程序的一次启动和下一次启动之间保持一致. - Marcus S Zarra在另一个帖子中的评论. (6认同)
  • 不要使用对象ID。首先,它可以是临时的,并在保存 NSManagedObject 时更改。其次,应用程序启动之间可能不一致。 (2认同)

bbu*_*bum 28

这不是CoreData的工作方式.

在CoreData中,您可以创建实体实例.每个实例都是唯一的.然后根据需要检索和操作实例.CoreData负责处理您的持久性,包括唯一标识实例.

远离传统关系数据库的所有知识.

CoreData是一项非常强大的技术,它提供的功能远远超出了持久性等数据库.如果你接受它,它将为你节省很多代码并且表现得非常好.

  • 我不同意"远离你所知道的一切".在某些情况下,您可能会获得没有区别属性的唯一实体(删除不遵守规则的服务器).拥有自动增量在这里很有用. (4认同)

Luk*_*asz 10

此类函数将返回id属性的下一个可用编号(它必须是整数属性).

我称之为自动增量值发生器.我仍然同意其他人认为有针对性的ID,但有时你只需要数字.

您可以将此函数放在实体的NSManagedObject子类中:

+(NSNumber *)nextAvailble:(NSString *)idKey forEntityName:(NSString *)entityName inContext:(NSManagedObjectContext *)context{


    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *moc = context;
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:moc];

    [request setEntity:entity];
    // [request setFetchLimit:1];

    NSArray *propertiesArray = [[NSArray alloc] initWithObjects:idKey, nil];
    [request setPropertiesToFetch:propertiesArray];
    [propertiesArray release], propertiesArray = nil;

    NSSortDescriptor *indexSort = [[NSSortDescriptor alloc] initWithKey:idKey ascending:YES];
    NSArray *array = [[NSArray alloc] initWithObjects:indexSort, nil];
    [request setSortDescriptors:array];
    [array release], array = nil;
    [indexSort release], indexSort = nil;

    NSError *error = nil;
    NSArray *results = [moc executeFetchRequest:request error:&error];
    // NSSLog(@"Autoincrement fetch results: %@", results);
    NSManagedObject *maxIndexedObject = [results lastObject];
    [request release], request = nil;
    if (error) {
        NSLog(@"Error fetching index: %@\n%@", [error localizedDescription], [error userInfo]);
    }
    //NSAssert3(error == nil, @"Error fetching index: %@\n%@", [error localizedDescription], [error userInfo]);

    NSInteger myIndex = 1;
    if (maxIndexedObject) {
        myIndex = [[maxIndexedObject valueForKey:idKey] integerValue] + 1;
    }

    return [NSNumber numberWithInteger:myIndex];
}
Run Code Online (Sandbox Code Playgroud)

  • 为了提高效率,请按降序排序,然后将获取限制设置为1.即`NSSortDescriptor*indexSort = [[NSSortDescriptor alloc] initWithKey:idKey ascending:NO];`然后取消注释`request.fetchLimit = 1;` (2认同)

小智 6

看看:[[NSProcessInfo processInfo] globallyUniqueString].

Apple文档:流程的全局ID.该ID包括主机名,进程ID和时间戳,以确保该ID对于网络是唯一的,如果您不希望人们猜测该ID,这将非常方便.


fly*_*pig 6

以下是CoreData对象的三种唯一ID表示形式:

NSManagedObjectID *taskID = [task objectID];
NSURL *taskUniqueURLKey = task.objectID.URIRepresentation;
NSString *taskUniqueStringKey = task.objectID.URIRepresentation.absoluteString;
Run Code Online (Sandbox Code Playgroud)

!!!!注意:如果你想使用上面的唯一键作为索引,请确保在使用之前将对象保存到上下文,或者objectID将是临时Id,稍后将替换它(例如在保存之后).查看NSManagedObjectID类的apple文档:

- (BOOL)isTemporaryID;    // indicates whether or not this ID will be replaced later, 
such as after a save operation (temporary IDs are assigned to newly inserted objects 
and replaced with permanent IDs when an object is written to a persistent store); most
 IDs return NO
Run Code Online (Sandbox Code Playgroud)