ios – 写入文本文件(附加)时,写入的最后一个值将替换所有以前的
发布时间:2020-12-15 02:01:57 所属栏目:百科 来源:网络整理
导读:我试图将我的SQLite3表重现为保存到手机文档中的.csv文件。 为了做到这一点,我试图在文件的末尾附加一行,每次在我的数组中找到一个对象,这是有效的 – 但是似乎再一次重现最后一行的确切数量我的sql表中的行。 这是SQLite选择查询: NSMutableArray *allG
我试图将我的SQLite3表重现为保存到手机文档中的.csv文件。
为了做到这一点,我试图在文件的末尾附加一行,每次在我的数组中找到一个对象,这是有效的 – 但是似乎再一次重现最后一行的确切数量我的sql表中的行。 这是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); } 这是写入.csv文件的方法: GPS *saveGPS = [[GPS alloc] init]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,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]]; 解决方法
您在重复循环中总是使用相同的GPS实例,因为引用语义会覆盖对象中的数据,并且在每次迭代中将相同的对象添加到数组中。
移动线 GPS *gps = [[GPS alloc] init]; 就在线之前 [gps setJobNo:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]]; 在每次迭代中创建一个新的GPS实例 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |