【发布时间】:2011-09-17 05:26:04
【问题描述】:
我正在制作一个使用核心数据的应用程序。 现在在这里我需要创建一个与我们在 sqlite 中创建的主键相同的主键(自动增量类型)。 这对核心数据是否可行。如果是,那么如何提供任何链接或建议,以及如何进行相同的操作。
问候 姆鲁根
【问题讨论】:
我正在制作一个使用核心数据的应用程序。 现在在这里我需要创建一个与我们在 sqlite 中创建的主键相同的主键(自动增量类型)。 这对核心数据是否可行。如果是,那么如何提供任何链接或建议,以及如何进行相同的操作。
问候 姆鲁根
【问题讨论】:
由于核心数据是一个比通用数据库更多的持久性框架,它抽象了主键。
【讨论】:
CoreData 不是数据库,而是它是一种对象关系映射解决方案。它是一个对象持久层。 CoreData 中没有主键或外键的概念。
如果你想在两个实体之间建立关系。您将定义一个关系,CoreData 负责该关系的存储方式。
选择一个实体,使用实体属性列表底部的加号按钮,选择添加关系,从下拉列表中选择目标实体。
选择目标实体,以同样的方式定义逆向关系。
【讨论】:
你不能只使用 NSManagedObject 的 objectID 属性吗?这将为您提供对对象的唯一引用。
【讨论】:
答案是否定的。 为了实现类似的事情, 您可以在表中拥有一个 'id' 字段,然后在插入表中获取 'id' 的最大值,然后将值加 1。
使用表 ENTITY_USER (users) 中的字段“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;
}
【讨论】: