2013-05-09 1 views
5

У меня есть таблица Пользователи и есть группа столбцов в базовой модели данных. Один из столбцов - 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; 

Надеюсь, что кто-то столкнулся с этой проблемой раньше и зафиксировал ее.

Спасибо

+0

Значение, которое вы видите, похоже на «нормальное» значение мусора, которое вы получаете от доступа к неинициализированным переменным. Установка 'nextAccountId' в ноль должна исправить это. Я не уверен, почему '[objects count]' возвращает ноль. – dasblinkenlight

+0

[количество объектов] не возвращает ноль. Я не уверен, о чем вы говорите? – Harish

+0

Не похоже, что в некоторых путях есть назначение 'nextAccountId', в частности, когда число равно нулю. Даниэль ответил ниже, добавив 'else', чтобы покрыть это. – dasblinkenlight

ответ

3

Спасибо, что посмотрели на вопрос. Также благодарим вас за комментарии и ответы. После выяснения проблемы просмотра базы данных sqlite с терминала я заметил, что таблица повреждена, и она возвращает все нежелательные значения. Вопрос был очень прост. Это то, что я сделал, чтобы исправить это.

  1. Удалено из приложения с iPhone Simulator.
  2. Чистый раствор
  3. рекомбинирован программа. Рань, и бам .. это сработало.

Просто наконечник проявитель для тех, кто не знал о доступе к SQLite от терминала.

  1. Укажите местоположение на ваш sqlite. Обычно /User/UserName/Library/Application Support/iPhone Simulator/6.1/xxxxxxxxxx/Documents cd в этот каталог.

  2. команды типа sqlite3

  3. придают "Application.sqlite", как DB1

  4. бац .. запускать команды.

  5. Если вы хотите посмотреть на базы данных, работающих в пределах - типа .database

Спасибо всем еще раз.

1

Этот код прекрасно работает для меня после того, как я удалил Try/код улова и упростили, если оператор после выборки запроса на это:

if ([objects count] > 0) { 
    nextAccountId = [[[objects objectAtIndex:0] valueForKey:@"maxAccountId"] integerValue]; 
} 
else { 
    nextAccountId = 0; 
} 

Если это не исправить убедитесь, что у вас есть правильный инициализированный контекст управляемого объекта (self._managedObjectContext vs. self.managedObjectContext в зависимости от того, как вы его определили), и имена объектов/атрибутов верны.

+0

Благодарю вас за ответ, я собираюсь попробовать это и сообщить вам, как это работает. – Harish

+0

Я пробовал то, что вы сказали, и это все равно дает мне ту же проблему. Прикрепление журнал, в комментарии (lldb) ро объекты $ 12 = 0x08156790 <_PFArray 0x8156790> ( { maxAccountId = 139784529; } ) – Harish

Смежные вопросы