我们可以在核心数据中设置主键

时间:2011-06-17 13:53:05

标签: iphone xcode core-data

我正在制作一个使用核心数据的应用程序。 现在,我需要创建一个与我们在sqlite(自动增量类型)中创建的主键相同的主键。 核心数据是否可行。如果是,那么如何进行任何链接或建议,以便如何进行。

此致 Mrugen

4 个答案:

答案 0 :(得分:4)

由于核心数据是一个持久性框架而不是通用数据库,因此它抽象了主键。

答案 1 :(得分:4)

CoreData不是数据库,而是它的对象关系映射解决方案。它是一个对象持久层。 CoreData中没有主键或外键的概念。

如果要在两个实体之间建立关系。您将定义一个关系,CoreData负责处理该关系的存储方式。

enter image description here

选择一个实体,使用实体属性列表底部的加号按钮,选择添加关系,从下拉列表中选择目标实体。

选择目标实体并以相同方式定义反向关系。

答案 2 :(得分: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;
}

答案 3 :(得分:2)

难道你不能只使用NSManagedObject的objectID属性吗?这将为您提供对象的唯一引用。