2015-08-19 18 views
19

Sto tentando di riprodurre la tabella SQLite3 come file .csv salvato nei documenti del telefono.Durante la scrittura su file di testo (aggiunta), l'ultimo valore che scrivo sostituisce tutti i valori precedenti

Per fare ciò, ho tentato di aggiungere una nuova riga alla fine del file, ogni volta che viene trovato un oggetto nel mio array, questo funziona, tuttavia sembra riprodurre l'ultima riga più e più volte per il numero esatto di righe nella mia tabella sql.

Ecco la query SQLite Select:

NSMutableArray *allGPS = [[NSMutableArray alloc] init]; 
    GPS *gps = [[GPS alloc] init]; 
// Open the database from the users filessytem 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"GPS.db"]; 
    if (sqlite3_open([databasePath UTF8String], &databaseHandle) == SQLITE_OK) 
    { 
     NSString *sqlStatement = [NSString stringWithFormat:@"SELECT * FROM GPSJob;"]; 
     sqlite3_stmt *statement; 
     if(sqlite3_prepare_v2(databaseHandle, [sqlStatement UTF8String], -1, &statement, NULL) == SQLITE_OK) { 
      NSLog(@"Statement prepared"); 
      while(sqlite3_step(statement) == SQLITE_ROW) 
      { 
       [gps setJobNo:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]]; 
       [gps setSourceMonitor:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]]; 
       [gps setPositionNo:[NSNumber numberWithInt:sqlite3_column_int(statement,2)]]; 
       [gps setLatitude:sqlite3_column_double(statement, 3)]; 
       [gps setLongitude:sqlite3_column_double(statement, 4)]; 
       NSLog(@"Source Monitor: %@", [gps sourceMonitor]); 
       [allGPS addObject:gps]; 
      } 
     } 
        sqlite3_finalize(statement); 
    } 

Ecco la scrittura in .csv metodo del file:

GPS *saveGPS = [[GPS alloc] init]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.csv", jobNo]]; 
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil]; 
    NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingAtPath:filePath]; 
    DataController *dataController = [[DataController alloc] init]; 
    NSString *csvTitleString [email protected]"Source/Monitor, PositionNumber, Latitude, Longitude \n"; 
    [myHandle seekToEndOfFile]; 
    [myHandle writeData:[csvTitleString dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *csvString = [[NSString alloc] init]; 
    NSArray *allGPS = [[NSArray alloc]initWithArray:[dataController getAll]]; 
    for(int i=0;i<(allGPS.count);i++){ 
     saveGPS = [allGPS objectAtIndex:i]; 
     csvString = [NSString stringWithFormat:@"%@, %d, %f, %f \n", [saveGPS sourceMonitor], [[saveGPS positionNo] intValue], [saveGPS latitude], [saveGPS longitude]]; 
     [myHandle seekToEndOfFile]; 
     [myHandle writeData:[csvString dataUsingEncoding:NSUTF8StringEncoding]]; 
+0

Forse crei una nuova istanza di 'gps' in ogni iterazione? while (sqlite3_step (statement) == SQLITE_ROW) { gps = [[allocazione GPS] init]; [GPS setJobNo: [NSString stringWithUTF8String: (char ... ...} – GuyMontag

+0

Se desideri che avete pubblicato come una risposta che avrebbe ottenuto la grazia :(:( –

+1

Noooooooo Vabbè, lasciamo perdere ;) – GuyMontag

risposta

9

Stai usando sempre la stessa istanza di GPS nel ciclo di ripetizione in modo a causa della semantica di riferimento, i dati nell'oggetto vengono sovrascritti e lo stesso oggetto viene aggiunto all'array in ogni iterazione.

Spostare la linea

GPS *gps = [[GPS alloc] init]; 

poco prima della linea di

[gps setJobNo:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]]; 

per creare una nuova istanza GPS in ogni iterazione

3

Crea una nuova istanza della gps -oggetto in ogni iterazione :

while(sqlite3_step(statement) == SQLITE_ROW) 
{ 
    gps = [[GPS alloc] init]; 

    [gps setJobNo:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]]; 
    [gps setSourceMonitor:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]]; 
    [gps setPositionNo:[NSNumber numberWithInt:sqlite3_column_int(statement,2)]]; 
    [gps setLatitude:sqlite3_column_double(statement, 3)]; 
    [gps setLongitude:sqlite3_column_double(statement, 4)]; 
    NSLog(@"Source Monitor: %@", [gps sourceMonitor]); 
    [allGPS addObject:gps]; 
}