2013-05-09 14 views
5

Ho una tabella Utenti e ho un mucchio di colonne nel modello di dati di base. Una delle colonne è user_id e sto cercando di ottenere il massimo user_id e aggiungere + 1 ad esso e passarlo all'oggetto successivo che verrà inserito. Ho seguito apple developer guide e implementato come suggerito. Ecco il codice che sto cercando di eseguire.Ottenere l'ID massimo dai dati di base e sqlite

Problema: il mio valore account_id che viene restituito è impostato su un numero strano che non esiste nemmeno nel database.

"account_id" = 139784529; Si suppone che sia 1 poiché ho salvato solo i dati principali.

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; 

Spero che qualcuno abbia affrontato il problema prima e l'abbia risolto.

Grazie

+0

Il valore visualizzato assomiglia a un valore di garbage "normale" ottenuto dall'accesso a variabili non inizializzate. Impostare 'nextAccountId' su zero dovrebbe risolvere il problema. Non sono sicuro del perché '[oggetti contano]' restituisce zero, comunque. – dasblinkenlight

+0

[numero oggetti] non restituisce zero. Non sono sicuro di cosa ti stai riferendo? – Harish

+0

Non sembra che ci sia un'assegnazione di 'nextAccountId' in alcuni percorsi, in particolare quando il conteggio è zero. La risposta di Daniel in basso ha aggiunto un "altro" per coprirlo. – dasblinkenlight

risposta

3

Grazie a tutti per dare un'occhiata alla domanda. Anche grazie per i commenti e le risposte. Dopo aver scoperto il problema con la visualizzazione del database SQLite dal terminale, ho notato che la tabella era corrotta e restituiva tutti i valori indesiderati. Il problema era davvero semplice. Questo è quello che ho fatto per risolverlo.

  1. Eliminata l'app da iPhone Simulator.
  2. Soluzione pulita
  3. compilato il programma. L'ho fatto, e bam .. ha funzionato.

Solo un consiglio di sviluppo per coloro che non conoscono SQLite accesso dal terminale.

  1. Calcola la posizione del tuo sqlite. Solitamente /User/UserName/Libreria/Application Support/iPhone Simulator/6.1/xxxxxxxxxx/Documents cd in questa directory.

  2. comando tipo sqlite3

  3. allegare "Application.sqlite", come DB1

  4. bam .. eseguire i comandi.

  5. Se si vuole guardare ai database in esecuzione all'interno - tipo .Database

Grazie a tutti ancora una volta.

1

Questo codice funziona bene per me dopo ho rimosso il codice try/catch e semplificato l'istruzione if dopo la richiesta di recupero a questo:

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

Se questo non risolvere il problema Confermare di disporre del contesto oggetto gestito inizializzato corretto (self._managedObjectContext rispetto a self.managedObjectContext in base a come lo si è definito) ei nomi di entità/attributo sono corretti.

+0

grazie per la risposta, ho intenzione di provare questo e ti faccio sapere come ha funzionato. – Harish

+0

Ho provato quello che hai detto e mi dà ancora lo stesso problema. Fissaggio del registro, nel commento oggetti (lldb) po $ 12 = 0x08156790 <_PFArray 0x8156790> ( { maxAccountId = 139.784.529; } ) – Harish