我们能在Core Data中设置主键吗?

5

我正在开发一个应用程序,其中使用core data。现在我需要创建一个主键,就像我们在sqlite中创建的那样(自动递增类型)。在core data中是否可能实现这一点?如果可以,那么该如何操作?有任何链接或建议吗?

谢谢 Mrugen


可能重复:https://dev59.com/YnNA5IYBdhLWcg3wmfAa - jamapag
4个回答

4

由于Core Data是一个持久化框架,而不是通用的数据库,因此它抽象了主键。


4
CoreData并不是数据库,而是一个对象关系映射解决方案。它是一个对象持久化层。在CoreData中没有主键或外键的概念。
如果您想建立两个实体之间的关系,您将定义一个关系,CoreData会处理如何存储该关系。
选择一个实体,在实体属性列表底部使用加号按钮,选择添加关系,从下拉列表中选择目标实体。
选择目标实体,并以同样的方式定义一个反向关系。

2

你可以使用NSManagedObject的objectID属性来获取对象的唯一标识,这样做可以方便地引用该对象。


2
答案是否定的。 要实现类似的功能, 您可以在表中添加一个“id”字段,在将其插入到表中之前获取“id”的最大值,然后将1添加到该值。
在表ENTITY_USER(用户)中有一个名为“userID”的字段,请获取最高的用户ID。
+ (NSInteger) getMaxUserID
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *res = [NSEntityDescription entityForName:ENTITY_USER
                                           inManagedObjectContext:[DataBaseManager sharedInstance].managedObjectContext];
    [request setEntity:res];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"userID" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptors release];
    [sortDescriptor release];

    [request setFetchLimit:1];

    NSError *error = nil;
    NSArray *results = [[DataBaseManager sharedInstance].managedObjectContext executeFetchRequest:request error:&error];
    [request release];
    if (results == nil) {
        NSLog(@"error fetching the results: %@",error);
    }

    NSInteger maximumValue = 0;
    if (results.count == 1) {
        CDUser *result = (CDUser *)[results objectAtIndex:0];
        maximumValue =  [result.userID integerValue];
    }
    return maximumValue;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接