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

Я пытаюсь воспроизвести таблицу 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]; } 
  • «Нет такого файла или каталога (2)» для libswiftSecurity.dylib на XCode 7
  • Xcode позволяет вам создать «спрайт-атлас» изнутри Assets.xcassets, действительно ли это атлас?
  • iOS Xcode (быстрый) - как выполнить код после размотки segue
  • Невозможно использовать «Vendored Framework» CocoaPod Inside Workspace Playground
  • Apple - iOS - Тестирование на iOS 10.3 с XCode 8.2.1
  • iTunes Connect - новые сборки не отображаются в TestFlight (Xcode 7.1)
  • Последовательный конфликт приложений iPhone при редактировании UITextField, нажав на значок Globe на iPhone Keyboard, как на аппаратном, так и на Simulator
  • Не удалось выполнить установку приложения XCode 9, не удалось выполнить запись на устройство
  • Альтернатива для all_load в других флагах Linker XCode
  • Xcode - импорт другого файла заголовка с тем же именем на основе Target
  • Свойство 'delegate' не найдено на объекте 'AddEventViewController'
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.