При записи в текстовый файл (добавление) последнее значение, которое я пишу, заменяет все предыдущие значения

Я пытаюсь воспроизвести таблицу SQLite3 в виде CSV-файла, который сохраняется в документах телефонов.

Для этого я попытался добавить новую строку в конец файла, каждый раз, когда объект найден в моем массиве, это работает – однако, похоже, он снова и снова воспроизводит последнюю строку для точного числа строки в моей таблице sql.

Вот запрос 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); } 

Вот способ записи в 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]]; 

2 Solutions collect form web for “При записи в текстовый файл (добавление) последнее значение, которое я пишу, заменяет все предыдущие значения”

Вы всегда используете один и тот же экземпляр GPS в цикле повтора, поэтому из-за ссылочной семантики данные в объекте перезаписываются, и один и тот же объект добавляется к массиву на каждой итерации.

Переместить линию

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

прямо перед строкой

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

создать новый экземпляр GPS на каждой итерации

Создайте новый экземпляр объекта gps на каждой итерации:

 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]; } 
  • Автоматически настраивать высоту UIView в подзону с помощью AutoLayout (Storyboard)
  • SecKey API возвращен: -25304 libswiftAVFoundation.dylib: неизвестная ошибка -1 = ffffffffffffffff ошибка: сбой задачи с выходом 1 0
  • Unity 3.5 to Unity 4.5.4
  • Файл «***. App» не может быть открыт, потому что у вас нет разрешения на просмотр
  • SpriteKit SKSpriteNode перемещается
  • Контроллер навигации без кнопки «Назад»
  • XCode 6.3.1 сбой при переименовании проекта
  • Может ли кто-нибудь сказать мне, что означают эти вопросительные знаки в окне моего навигатора? (Xcode 4.2)
  • iOS - запуск приложения очень медленно при первом запуске
  • Сбой приложения Unity на iOS из-за того, что шейдер не скомпилирован
  • Как передать информацию обратно в контроллер просмотра из контроллера просмотра, к которому он нажат?
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.