2013-05-09 10 views
5

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ę

+0

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

+0

[liczba obiektów] nie zwraca zero. Nie jestem pewien, co masz na myśli? – Harish

+0

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

Odpowiedz

3

Dziękuję wszystkim za spojrzenie na to pytanie. Dziękuję również za uwagi i odpowiedzi. Po wykryciu problemu z wyświetlaniem bazy danych sqlite z terminala zauważyłem, że tabela została uszkodzona i przywracała mi wszystkie wartości śmieci. Problem był naprawdę prosty. Właśnie to zrobiłem, aby to naprawić.

  1. Usunięto aplikację z iPhone Simulator.
  2. Czyste rozwiązanie
  3. re skompilował program. Uruchomiłem to i bam ... zadziałało.

Porada dla programistów dla tych, którzy nie wiedzieli o uzyskując dostęp do sqlite z terminala.

  1. Określ lokalizację dla swojego sqlite. Zwykle /User/UserName/Library/Application Support/iPhone Simulator/6.1/xxxxxxxxxx/Documents cd do tego katalogu.

  2. komenda typu sqlite3

  3. dołączyć "Application.sqlite" jako db1

  4. BAM .. uruchomić swoje polecenia.

  5. Jeśli chcesz spojrzeć na baz danych działających wewnątrz - typu .database

Dziękuję wszystkim jeszcze raz.

1

Ten kod działa dobrze dla mnie po usunięciu try/catch kod i uprościł if po sprowadzić prośbę do tego:

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

Jeśli to nie naprawić potwierdź, że masz poprawnie zainicjowany kontekst obiektu zarządzanego (zależnie od tego, jak go zdefiniowałeś) i nazwy encji/atrybutów są poprawne.

+0

dziękuję za odpowiedź, spróbuję tego i dam ci znać, jak to działało. – Harish

+0

Próbowałem, co powiedziałeś i nadal daje mi ten sam problem. Mocowanie dziennik w komentarzu (lldb) PO obiektów $ 12 = 0x08156790 <_PFArray 0x8156790> ( { maxAccountId = 139784529; } ) – Harish

Powiązane problemy