1 是一种序列化方式,先将归档对象序列化为一个文件,然后再通过反归档将数据恢复到对象中。
条件:该对象的类必须实现NSCoding协议,而且每个成员变量应该是基本数据类型或都是实现NSCoding协议的某个类的实例。
归档类NSKeyedArchiver 反归档类NSKeyedUnarchiver NSData类提供了读取数据文件的方法
方法:+dataWithContentsOfFile:
+dataWithContentsOfFile:options:指定读取数据选项error:
-initWithContentsOfFile:/options:error:
-writeToFile:atomically:若文件不存在在这时候创建一个
-writeToFile:options:error:
2 归档:封装NSData对象-封装NSKeyedArchiver对象-编码-完成编码-写入文件
- (void)createEditableCopyOfDatabaseIfNeeded { NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *writableDBPath = [self applicationDocumentsDirectoryFile]; BOOL dbexits = [fileManager fileExistsAtPath:writableDBPath]; if (!dbexits) { NSString *path = [self applicationDocumentsDirectoryFile]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *date1 = [dateFormatter dateFromString:@"2010-08-04 16:01:03"]; Note* note1 = [[Note alloc] init]; note1.date = date1; note1.content = @"Welcome to MyNote."; NSMutableArray* array = [[NSMutableArray alloc] init]; [array addObject:note1]; NSMutableData * theData = [NSMutableData data]; NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:theData]; [archiver encodeObject:array forKey:ARCHIVE_KEY];里面的Note对象必须是实现NSCoding协议 [archiver finishEncoding]; [theData writeToFile:path atomically:YES]; } } - (NSString *)applicationDocumentsDirectoryFile { NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [documentDirectory stringByAppendingPathComponent:FILE_NAME]; return path; }
Note类必须实现NSCoding协议:
-(void)encodeWithCoder:(NSCoder *)aCoder {编码 [aCoder encodeObject:_date forKey:@"date"]; [aCoder encodeObject:_content forKey:@"content"]; } -(id)initWithCoder:(NSCoder *)aDecoder {反编码 self.date = [aDecoder decodeObjectForKey:@"date"]; self.content = [aDecoder decodeObjectForKey:@"content"]; return self; }
3 反归档:查询
//查询所有数据方法 -(NSMutableArray*) findAll { NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *listData = [[NSMutableArray alloc] init]; NSData * theData =[NSData dataWithContentsOfFile:path]; if([theData length] > 0) {判断归档对象是否有数据 NSKeyedUnarchiver * archiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData]; listData = [archiver decodeObjectForKey:ARCHIVE_KEY]; [archiver finishDecoding]; } return listData; } //按照主键查询数据方法 -(Note*) findById:(Note*)model { NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *listData = [[NSMutableArray alloc] init]; NSData * theData =[NSData dataWithContentsOfFile:path]; if([theData length] > 0) { NSKeyedUnarchiver * archiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData]; listData = [archiver decodeObjectForKey:ARCHIVE_KEY]; [archiver finishDecoding]; for (Note* note in listData) { //比较日期主键是否相等 if ([note.date isEqualToDate:model.date]){ return note; } } } return nil; }
时间: 2024-11-20 19:55:55