Mam użytkowników tabeli i kilka kolumn w modelu danych podstawowych. Jedna z kolumn to user_id i próbuję uzyskać najwyższy user_id i dodać + 1 do niego i przekazać go do następnego obiektu, który zostanie wstawiony. Postępowałem zgodnie z apple developer guide i zaimplementowałem zgodnie z sugestią. Oto kod, który próbuję wykonać.Uzyskiwanie Max ID z danych podstawowych i sqlite
Problem: zwracana wartość zwracana przez mój account_id jest ustawiana na jakiś dziwny numer, który nawet nie istnieje w bazie danych.
"account_id" = 139784529; Powinno być 1, ponieważ zapisałem tylko w danych podstawowych.
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;
Mam nadzieję, że ktoś napotkał ten problem wcześniej i naprawił go.
Dziękuję
Wartość, którą widzisz, wygląda jak "normalna" wartość śmieci, którą uzyskujesz, uzyskując dostęp do niezainicjowanych zmiennych. Ustawienie "nextAccountId" na zero powinno to naprawić. Nie jestem pewien, dlaczego "[liczba obiektów]" zwraca zero. – dasblinkenlight
[liczba obiektów] nie zwraca zero. Nie jestem pewien, co masz na myśli? – Harish
Wygląda na to, że nie ma przypisania 'nextAccountId' w niektórych ścieżkach, szczególnie gdy zliczenie wynosi zero. Poniższa odpowiedź Daniela dodała "jeszcze", żeby to ukryć. – dasblinkenlight