una txt texto partir open lista linea leer importar guardar especifica español escribir crear con como archivos archivo ios objective-c xcode sqlite3 nsfilemanager

ios - txt - open en python



Al escribir en un archivo de texto(agregar), el último valor que escribo reemplaza todos los valores anteriores (2)

Estoy intentando reproducir mi tabla SQLite3 como un archivo .csv que se guarda en los documentos de los teléfonos.

Para hacer esto, he intentado agregar una nueva línea al final del archivo, cada vez que se encuentra un objeto en mi matriz, esto funciona. Sin embargo, parece reproducir la última línea una y otra vez para el número exacto de filas en mi tabla sql.

Aquí está la consulta de selección de SQLite:

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); }

Aquí está el método de escritura en archivo .csv:

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 =@"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]];


Cree una nueva instancia del objeto gps en cada iteración:

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]; }


Siempre está utilizando la misma instancia de GPS en el ciclo de repetición, por lo que, debido a la semántica de referencia, los datos en el objeto se sobrescriben y el mismo objeto se agrega a la matriz en cada iteración.

Mueve la linea

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

justo antes de la linea

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

Para crear una nueva instancia de GPS en cada iteración.