2013.10.05補充 參考自 http://www.cnblogs.com/chinapcc/archive/2013/04/03/2673092.html
要把自定義類保存到plist文件里,要注意一下三點:
1、自定義類要繼承NSCoding協議,實現 -(void)encodeWithCoder:(NSCoder *)coder 方法和 - (id) initWithCoder: (NSCoder *)coder方法
2、在寫入plist文件時要對數據序列化然后寫入:[NSKeyedArchiver archiveRootObject:array toFile:filename];array是要寫入的數據,filename是plist文件路徑
3、在讀取plist文件數據時要對數據反序列化才能用:NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];
建議在有條件的情況下還是把數據放到 NSMutableArray / NSArray / NSMutableDictionary / NSDictionary 里,寫入plist文件吧
ios項目的文件分工程項目里的文件和程序沙盒里的文件兩種,其中項目工程里的文件是只讀的,為沙盒里的文件可讀可寫.對於讀文件而言,不管是工程里的還是沙盒的,方法都一樣,唯一不同的在於文件路徑的獲取.
1 文件目錄
2 txt文件.每一行數據的字段之間是用 \t 來分割
3 TWFXCityCode類:
1 #import <Foundation/Foundation.h> 2 3 @interface TWFXCityCode : NSObject 4 { 5 @public 6 NSString *cityName; 7 NSString *cityCode; 8 NSString *pinyin; 9 NSString *sortPinyin; 10 NSString *provinceName; 11 NSString *provinceCode; 12 } 13 14 @end
4 TWFXViewController類的頭文件
1 #import <UIKit/UIKit.h> 2 #import "TWFXCityCode.h" 3 4 @interface TWFXViewController : UIViewController 5 6 @property (retain, nonatomic) NSMutableArray *weatherData; 7 8 - (IBAction)btnClick_readFile:(UIButton *)sender; 9 - (IBAction)btnClick_writePlist:(UIButton *)sender; 10 - (IBAction)btnClick_readPlist:(UIButton *)sender; 11 - (IBAction)btnClick_test:(UIButton *)sender; 12 @end
5 項目工程里txt文件的讀取:
1 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test123" ofType:@"txt"]; 2 3 NSArray *fileData; 4 NSError *error; 5 6 //讀取file文件並把內容根據換行符分割后賦值給NSArray 7 fileData = [[NSString stringWithContentsOfFile:filePath 8 encoding:NSUTF8StringEncoding 9 error:&error] 10 componentsSeparatedByString:@"\n"]; 11 12 13 //獲取NSArray類型對象的迭代器 14 NSEnumerator *arrayEnumerator = [fileData objectEnumerator]; 15 NSString *tempStr; 16 17 while (tempStr = [arrayEnumerator nextObject]) { 18 19 TWFXCityCode *cityCode = [[TWFXCityCode alloc] init]; 20 21 //把每行字符串再按 \t 符分割 22 NSArray *cityInfo = [tempStr componentsSeparatedByString:@"\t"]; 23 24 cityCode->cityCode = cityInfo[0]; 25 cityCode->cityName = cityInfo[1]; 26 cityCode->pinyin = cityInfo[2]; 27 cityCode->sortPinyin = cityInfo[3]; 28 cityCode->provinceCode = cityInfo[4]; 29 cityCode->provinceName = cityInfo[5]; 30 31 [self.weatherData addObject:cityCode]; 32 [cityCode release]; 33 }
6 把數據保存到沙盒里的plist文件
1 //獲取應用程序沙盒的Documents目錄 2 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 3 4 NSString *plistPath1 = [paths objectAtIndex:0]; 5 6 //得到完整路徑名 7 NSString *filename = [plistPath1 stringByAppendingPathComponent:@"weathertest.plist"]; 8 9 //保存對字符串解析后的數據.dictionary里的value不能是自定類型對象么?還是說自定義類要實現指定的協議? 10 //沒辦法,暫時先用一個dictionary來保存value吧 11 NSMutableDictionary *myDic = [[NSMutableDictionary alloc] init]; 12 13 for (TWFXCityCode *city in self.weatherData) { 14 15 NSMutableDictionary *tempDic = [[NSMutableDictionary alloc] init]; 16 [tempDic setValue:city->cityCode forKey:@"cityID"]; 17 [tempDic setValue:city->cityName forKey:@"cityName"]; 18 [tempDic setValue:city->pinyin forKey:@"cityPinyin"]; 19 [tempDic setValue:city->sortPinyin forKey:@"citySortPinyin"]; 20 [tempDic setValue:city->provinceCode forKey:@"provinceID"]; 21 [tempDic setValue:city->provinceName forKey:@"provinceName"]; 22 23 [myDic setValue:tempDic forKey:city->cityCode]; 24 } 25 26 NSLog(@"寫plist文件完成"); 27 [myDic writeToFile:filename atomically:YES]; 28
7 沙盒里plist文件的內容