【发布时间】:2011-05-04 07:53:23
【问题描述】:
您好,我在我的应用程序中使用核心数据,并希望将每个实体中的 ID 属性设置为自动增量。核心数据有可能吗?还是我必须手动插入条目并以编程方式管理增量??
【问题讨论】:
标签: iphone
您好,我在我的应用程序中使用核心数据,并希望将每个实体中的 ID 属性设置为自动增量。核心数据有可能吗?还是我必须手动插入条目并以编程方式管理增量??
【问题讨论】:
标签: iphone
如果您正在考虑主键的 id,那么核心数据会为您处理这个问题。在每个对象上都有一个 objectID 属性,您可以访问它来查看它。当您从托管对象上下文创建对象时,核心数据会分配一个临时 ID。当您从托管对象上下文提交更改时,核心数据会分配一个永久 id。我认为手动尝试设置它不是一个好主意。
阅读this stackoverflow thread了解更多详情。
【讨论】:
我在NSFetchedResultsController中使用了这种方式:
第一次排序:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]
然后在添加对象方法中:
// Minimum id value
var recordID = 1
if let lastRecordID = fetchedResultsController.fetchedObjects?.first?.id {
recordID = Int(lastRecordID) + 1
}
let newRecord = Record(context: persistentContainer.viewContext)
newRecord.id = Int32(recordID)
【讨论】:
你可以这样做 之后
saveContext()
目标-c:
- (int)getAutoIncrement {
int number = 0;
NSURL *url = [[self objectID] URIRepresentation];
NSString *urlString = url.absoluteString
NSString *pN = [[urlString componentsSeparatedByString:@"/"] lastObject];
if ([pN containsString:"p"]){
NSString *stringPart = [pN stringByReplacingOccurrencesOfString:@"p" withString:@""]
number = stringPart.intValue
}
url = nil;
urlString = nil;
pN = nil;
stringPart = nil;
return number;
}
斯威夫特:
func getAutoIncremenet() -> Int64 {
let url = self.objectID.uriRepresentation()
let urlString = url.absoluteString
if let pN = urlString.components(separatedBy: "/").last {
let numberPart = pN.replacingOccurrences(of: "p", with: "")
if let number = Int64(numberPart) {
return number
}
}
return 0
}
【讨论】: