我有一个实体Person,其属性为personId(personId是唯一的)如何获取具有最大personId的Person?(我想获取的是人本身,而不是财产的价值)
Person
personId
aiazj4mn1#
将fetchLimit设置为1,并按personId降序排序。例如:
fetchLimit
1
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Person"];fetchRequest.fetchLimit = 1;fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"personId" ascending:NO]];NSError *error = nil;id person = [managedObjectContext executeFetchRequest:fetchRequest error:&error].firstObject;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
fetchRequest.fetchLimit = 1;
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"personId" ascending:NO]];
NSError *error = nil;
id person = [managedObjectContext executeFetchRequest:fetchRequest error:&error].firstObject;
字符串
bz4sfanl2#
您需要使用带有NSPerdicate的NSFetchRequest来指定查询...改编自Apple的同品种程序指南:
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];[request setEntity:entity];request.predicate = [NSPredicate predicateWithFormat:@"personId==max(personId)"];request.sortDescriptors = [NSArray array];NSError *error = nil;NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person"
inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
request.predicate = [NSPredicate predicateWithFormat:@"personId==max(personId)"];
request.sortDescriptors = [NSArray array];
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
lstz6jyr3#
建议使用Apple Recommended Method NSExpression。我希望这会比使用排序更便宜。如果你想一想,使用排序你将不得不把所有的记录排序,并保留最大的一个。对于表达式,您只需通读列表并在内存中保留最大值。下面是我使用NSDate的一个示例
- (NSDate *)lastSync:(PHAssetMediaType)mediaType { NSEntityDescription *entity = [NSEntityDescription entityForName:kMediaItemEntity inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; fetchRequest.entity = entity; fetchRequest.resultType = NSDictionaryResultType; NSMutableArray *predicates = [NSMutableArray array]; [predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaType,mediaType]]; [predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaProviderType,self.mediaProviderType]]; NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates: predicates]; fetchRequest.predicate = predicate; // Create an expression for the key path. NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:kSyncTime]; // Create an expression to represent the function you want to apply NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:" arguments:@[keyPathExpression]]; // Create an expression description using the maxExpression and returning a date. NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; [expressionDescription setName:@"maxDate"]; [expressionDescription setExpression:maxExpression]; [expressionDescription setExpressionResultType:NSDateAttributeType]; // Set the request's properties to fetch just the property represented by the expressions. fetchRequest.propertiesToFetch = @[expressionDescription] ; // @[kSyncTime]; NSError *fetchError = nil; id requestedValue = nil; // fetch stored media NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError]; if (fetchError || results == nil || results.count == 0) { return [NSDate dateWithTimeIntervalSince1970:0]; } requestedValue = [[results objectAtIndex:0] valueForKey:@"maxDate"]; if (![requestedValue isKindOfClass:[NSDate class]]) { return [NSDate dateWithTimeIntervalSince1970:0]; } DDLogDebug(@"sync date %@",requestedValue); return (NSDate *)requestedValue;}
- (NSDate *)lastSync:(PHAssetMediaType)mediaType {
NSEntityDescription *entity = [NSEntityDescription entityForName:kMediaItemEntity inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = entity;
fetchRequest.resultType = NSDictionaryResultType;
NSMutableArray *predicates = [NSMutableArray array];
[predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaType,mediaType]];
[predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaProviderType,self.mediaProviderType]];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates: predicates];
fetchRequest.predicate = predicate;
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:kSyncTime];
// Create an expression to represent the function you want to apply
NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:"
arguments:@[keyPathExpression]];
// Create an expression description using the maxExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"maxDate"];
[expressionDescription setExpression:maxExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];
// Set the request's properties to fetch just the property represented by the expressions.
fetchRequest.propertiesToFetch = @[expressionDescription] ; // @[kSyncTime];
NSError *fetchError = nil;
id requestedValue = nil;
// fetch stored media
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
if (fetchError || results == nil || results.count == 0) {
return [NSDate dateWithTimeIntervalSince1970:0];
}
requestedValue = [[results objectAtIndex:0] valueForKey:@"maxDate"];
if (![requestedValue isKindOfClass:[NSDate class]]) {
DDLogDebug(@"sync date %@",requestedValue);
return (NSDate *)requestedValue;
00jrzges4#
上面使用NSExpression给出的答案是正确的。这是Swift版本。
private func getLastSyncTimestamp() -> Int64? {let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()request.entity = NSEntityDescription.entity(forEntityName: "EntityName", in: self.moc)request.resultType = NSFetchRequestResultType.dictionaryResultTypelet keypathExpression = NSExpression(forKeyPath: "timestamp")let maxExpression = NSExpression(forFunction: "max:", arguments: [keypathExpression])let key = "maxTimestamp"let expressionDescription = NSExpressionDescription()expressionDescription.name = keyexpressionDescription.expression = maxExpressionexpressionDescription.expressionResultType = .integer64AttributeTyperequest.propertiesToFetch = [expressionDescription]var maxTimestamp: Int64? = nildo { if let result = try self.moc.fetch(request) as? [[String: Int64]], let dict = result.first { maxTimestamp = dict[key] }} catch { assertionFailure("Failed to fetch max timestamp with error = \(error)") return nil}return maxTimestamp}
private func getLastSyncTimestamp() -> Int64? {
let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
request.entity = NSEntityDescription.entity(forEntityName: "EntityName", in: self.moc)
request.resultType = NSFetchRequestResultType.dictionaryResultType
let keypathExpression = NSExpression(forKeyPath: "timestamp")
let maxExpression = NSExpression(forFunction: "max:", arguments: [keypathExpression])
let key = "maxTimestamp"
let expressionDescription = NSExpressionDescription()
expressionDescription.name = key
expressionDescription.expression = maxExpression
expressionDescription.expressionResultType = .integer64AttributeType
request.propertiesToFetch = [expressionDescription]
var maxTimestamp: Int64? = nil
do {
if let result = try self.moc.fetch(request) as? [[String: Int64]], let dict = result.first {
maxTimestamp = dict[key]
} catch {
assertionFailure("Failed to fetch max timestamp with error = \(error)")
return nil
return maxTimestamp
字符串其中moc是NSManagedObjectContext。
mfuanj7w5#
Swift 3
let request:NSFetchRequest = Person.fetchRequest()let sortDescriptor1 = NSSortDescriptor(key: "personId", ascending: false)request.sortDescriptors = [sortDescriptor1]request.fetchLimit = 1do { let persons = try context.fetch(request) return persons.first?.personId} catch { print(error.localizedDescription)}
let request:NSFetchRequest = Person.fetchRequest()
let sortDescriptor1 = NSSortDescriptor(key: "personId", ascending: false)
request.sortDescriptors = [sortDescriptor1]
request.fetchLimit = 1
let persons = try context.fetch(request)
return persons.first?.personId
print(error.localizedDescription)
vsaztqbk6#
SWIFT 4
let request: NSFetchRequest<Person> = Person.fetchRequest()request.fetchLimit = 1 let predicate = NSPredicate(format: "personId ==max(personId)")request.predicate = predicatevar maxValue: Int64? = nildo { let result = try self.context.fetch(request).first maxValue = result?.personId} catch { print("Unresolved error in retrieving max personId value \(error)")}
let request: NSFetchRequest<Person> = Person.fetchRequest()
let predicate = NSPredicate(format: "personId ==max(personId)")
request.predicate = predicate
var maxValue: Int64? = nil
let result = try self.context.fetch(request).first
maxValue = result?.personId
print("Unresolved error in retrieving max personId value \(error)")
uubf1zoe7#
除了Ryan的回答,在今天的Swift中,NSManagedObject的execute(_:)返回一个NSPersistentStoreResult对象,它需要一些额外的代码来检索值:
NSManagedObject
execute(_:)
NSPersistentStoreResult
// Cast `NSPersistentStoreResult` to `NSAsynchronousFetchResult<NSDictionary>`let fetchResult = moc.execute(request) as! NSAsynchronousFetchResult<NSDictionary>// Retrieve array of dictionary resultlet dictsResult = fetchResult.finalResult// Retrieve and cast the real resultlet key = /* `expressionDescription.name` */let result = dictsResult.first!.object(forKey: key) as! /* Your type, depending on `expressionDescription.expressionResultType` */
// Cast `NSPersistentStoreResult` to `NSAsynchronousFetchResult<NSDictionary>`
let fetchResult = moc.execute(request) as! NSAsynchronousFetchResult<NSDictionary>
// Retrieve array of dictionary result
let dictsResult = fetchResult.finalResult
// Retrieve and cast the real result
let key = /* `expressionDescription.name` */
let result = dictsResult.first!.object(forKey: key) as! /* Your type, depending on `expressionDescription.expressionResultType` */
7条答案
按热度按时间aiazj4mn1#
将
fetchLimit
设置为1
,并按personId
降序排序。例如:字符串
bz4sfanl2#
您需要使用带有NSPerdicate的NSFetchRequest来指定查询...
改编自Apple的同品种程序指南:
字符串
lstz6jyr3#
建议使用Apple Recommended Method NSExpression。我希望这会比使用排序更便宜。如果你想一想,使用排序你将不得不把所有的记录排序,并保留最大的一个。对于表达式,您只需通读列表并在内存中保留最大值。
下面是我使用NSDate的一个示例
字符串
00jrzges4#
上面使用NSExpression给出的答案是正确的。这是Swift版本。
字符串
其中moc是NSManagedObjectContext。
mfuanj7w5#
Swift 3
字符串
vsaztqbk6#
SWIFT 4
字符串
uubf1zoe7#
除了Ryan的回答,在今天的Swift中,
NSManagedObject
的execute(_:)
返回一个NSPersistentStoreResult
对象,它需要一些额外的代码来检索值:字符串