У меня есть таблица Пользователи и есть группа столбцов в базовой модели данных. Один из столбцов - user_id, и я пытаюсь получить самый высокий user_id и добавить +1 к нему и передать его следующему объекту, который будет вставлен. Я следовал за apple developer guide и реализовал, как было предложено. Вот код, который я пытаюсь выполнить.Получение Max ID от основных данных и sqlite
Проблема: Возвращаемое значение my account_id устанавливается на некоторый странный номер, который даже не существует в базе данных.
"account_id" = 139784529; Предполагается, что он будет 1, поскольку я сохранил только данные ядра.
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:self._managedObjectContext];
[request setEntity:entity];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"account_id"];
// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"max:"
arguments:@[keyPathExpression]];
// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxAccountId"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType]; // For example, NSDateAttributeType
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:@[expressionDescription]];
// Execute the fetch.
NSError *error;
NSArray *objects = [self._managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
// Handle the error.
}
else {
if ([objects count] > 0) {
nextAccountId = [[[objects objectAtIndex:0] valueForKey:@"maxAccountId"] integerValue];
}
}
}
@catch (NSException *exception) {
NSLog(@"%@",[exception reason]);
}
return nextAccountId + 1;
Надеюсь, что кто-то столкнулся с этой проблемой раньше и зафиксировал ее.
Спасибо
Значение, которое вы видите, похоже на «нормальное» значение мусора, которое вы получаете от доступа к неинициализированным переменным. Установка 'nextAccountId' в ноль должна исправить это. Я не уверен, почему '[objects count]' возвращает ноль. – dasblinkenlight
[количество объектов] не возвращает ноль. Я не уверен, о чем вы говорите? – Harish
Не похоже, что в некоторых путях есть назначение 'nextAccountId', в частности, когда число равно нулю. Даниэль ответил ниже, добавив 'else', чтобы покрыть это. – dasblinkenlight