数据持久性的方式 NSKeyedArchiver --- 对象归档 NSUserDefaults 属性列表化(NSArray、NSDictionary保存文件) SQlite数据库、Core Data数据库 hello"]; NSString *filepath = [homeDirectory stringByAppendingPathComponent:@"temparray.adsf"]; if([NSKeyedArchiver stringByAppendingPathComponent:@"data.archive"]; //自定义归档 NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeFloat:
我们还可以用NSKeyedArchiver方式来进行归档,用NSKeyedUnarchiver相应的方式进行反归档。 :@"ArchiverDictionary.archiver"]; [NSKeyedArchiver archiveRootObject:dataDictionary toFile:dictionaryName ];// NSKeyedArchiver 将数据归档到NSArray或NSMutableArrayNSString *arrayName= [filePath stringByAppendingPathComponent :@"ArchiverArray.archiver"]; [NSKeyedArchiver archiveRootObject:dataArray toFile:arrayName];// NSKeyedUnarchiver if (isSuccess) { NSLog(@"Success"); }else{ NSLog(@"False"); } isSuccess= [NSKeyedArchiver
iOS数据持久化方式 (1)XML属性列表(plist)归档 (2)Preference(偏好设置),本质还是通过“plist”来存储数据, 但是使用更简单(无需关注文件、文件夹路径和名称) (3)NSKeyedArchiver NSUserDefaults standardUserDefaults]; (2)用一个变量接收 switcher.on = [userDefault boolForKey:@"key_name"]; 3、自定义对象归档 NSKeyedArchiver (2)归档一个对象(先获取路径path) Person *person = [[[Person alloc] init]; [NSKeyedArchiver archiveRootObject:person NSMutableData data]创建可变数据空间 (1) 归档步骤 // 新建一块可变数据区 NSMutableData *data = [NSMutableData data]; // 将数据区连接到一个NSKeyedArchiver 对象 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; // 开始存档对象
使用归档先将model转为NSData,再存储 思路:既然NSUserDefaults不支持自定义类型存储,但是支持NSData类型存储,就通过NSKeyedArchiver转成NSData类型,再存储 ~ NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_productModel]; [[NSUserDefaults standardUserDefaults mn_getSaveModelWithkey:(NSString *)key modelClass:(Class)modelClass; 内部实现原理: //传入model,进行模型转字典 ,字典通过NSKeyedArchiver //model转json NSDictionary *productDic = [model yy_modelToJSONObject]; NSData *data = [NSKeyedArchiver
既然涉及到了Model类的对象,就要考虑用归档(NSKeyedArchiver)来处理它了。NSKeyedArchiver能够存储的数据范围很广,因为它对应着MVC中的Model层,即实体类。 接下来我们来讲讲NSKeyedArchiver的使用。 即 : NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_dataSource]; [[NSUserDefaults data forKey:kEditInfraredRepeater]; [[NSUserDefaults standardUserDefaults]synchronize]; 三行代码,就把NSKeyedArchiver
子类: NSKeyedArchiver (序列化) 从二进制流读取对象。 子类: NSKeyedUnarchiver (反序列化) 把对象写到二进制流中去。 NSUserDomainMask, YES) lastObject]; NSString *filePath = [path stringByAppendingString:@"/holderModel"]; [NSKeyedArchiver unarchiveObjectWithFile:filePath]; NSUserDefault存Model // Model 实现`NSCoding`协议 // 存 NSData *data = [NSKeyedArchiver
想要把它存储在本地plist文件中,需要用到 NSKeyedArchiver 和 NSKeyedUnarchiver 但是在此之前,你需要把你的类改造一下。 ? 起初的类 ? 而一旦 encode 方法被实现,NSKeyedArchiver 和 NSKeyedUnarchiver 马上就被“解锁”并可以替代 writeToFile 方法啦! ?
其实相关的类名为 NSKeyedArchiver ,keyed 在这里应该是对归档的数据赋上了键的意思,就想给文件存档时要按照有文件名。 demoPath = [homeDirectory stringByAppendingPathComponent:@"demo.archiver"];// 添加存储的文件名 BOOL flag = [NSKeyedArchiver multi.archiver"]; //存储多个对象的容器 NSMutableData *multiData = [[NSMutableData alloc] init]; NSKeyedArchiver *multiArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:multiData]; [multiArchiver
3)、使用NSKeyedArchiver对自定义对象进行归档, 使用NSKeyedUnarchiver解析归档对象 首先自定义类需要实现NSCoding协议,然后实现方法 - (void NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"tanPerson.data"]; if ([NSKeyedArchiver 4)使用NSKeyedArchiver归档多个对象和解析 /* 使用NSKeyedArchiver归档多个对象 */ - (IBAction)saveMulObjectByArchive:(id)sender 以便随后写入文件,或者存放从磁盘读取的文件内容 NSMutableData *data = [NSMutableData data]; //新建一块可变数据区 //将数据区连接到一个NSKeyedArchiver 对象 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
其存储与读取的过程,主要封装在两个类中:NSKeyedArchiver和NSKeyedUnarchiver。 archivedDataWithRootObject:@"123"]; [data writeToFile:homePath atomically:YES]; //方式二:直接写入文件 [NSKeyedArchiver data对象作为归档的容器 NSMutableData * data = [[NSMutableData alloc]init]; //创建一个归档对象,归档后写入data数据 NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; //对下面的字符串和int值进行归档序列化 MyObject * obj = [[MyObject alloc]init]; obj.name = @"jaki"; obj.age = 24; NSData * data = [NSKeyedArchiver
涉及到知识点: 接入三方登录(友盟等平台有成熟的方案,不是本文讨论的重点) touchID、faceID keychain RSA加密 本地缓存,安全起见我选择NSKeyedArchiver(归档) 明确了目标就开始搞 NSKeyedArchiver 这个也是iOS中比较基础的数据本地化方案,因为Apple对数据会做加密然后写成文件,安全性相对较高,个人信息推荐使用这种方式来缓存。 一定要注意这个坑我补了好久,放出最基本的代码 //归档 if #available(iOS 11.0, *) { do { let data = try NSKeyedArchiver.archivedData } } catch { assert(true, "无法生成归档数据") return false } }else{ return NSKeyedArchiver.archiveRootObject
iOS应用数据存储的方式 1、XML属性列表(plist)归档 2、preference(偏好设置) 3、NSKeyedArchiver归档(NSCoding) 4、SQLite3 5、Core YES)[0]; NSString *filePath = [cachepath stringByAppendingPathComponent:@"person.data"]; [NSKeyedArchiver
在本地存储时,我们可以使用YYModel将对象转成json对应的NSData,也可以使用NSKeyedArchiver结合实现NSCoding协议把对象转成NSData,进而将二进制数据存储在沙盒中或者数据库 因为项目中序列化数据到沙盒是一个高频场景,尝试过数据库、NSCoding+NSKeyedArchiver、YYModel等方法都有各自瓶颈:数据内容比较大数据库会造成体积膨胀过快不便管理,NSCoding +NSKeyedArchiver在序列化数据量较大的情况下性能不佳,YYModel在变动的时候不太友好。
value", @"USD", @"currencyCode",nil]; NSMutableData *data =[[NSMutableData alloc] init]; NSKeyedArchiver NSData NSArray 转换 NSArray *arr1= [[NSArray alloc]initWithObjects:@"0",@"5",nil]; NSData *data= [NSKeyedArchiver
fileName = [self filePath: @"student.archiver"]; NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data]; Student* student = [[ NSMutableData *theData = [NSMutableData data]; //创建NSKeyedArchiver实例,用于将对象归档到此theData实例中。 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: theData]; //使用“键-
Swift论坛 讨论是否应该用 Codable 还是用 NSCoding[3] 讨论NSKeyedArchiver, CoreData 和其他的存储方案[4] 讨论数组的悬空指针[5] do { NSCoding: https://forums.swift.org/t/should-i-stick-with-codable-or-switch-back-to-nscoding/61604 [4]NSKeyedArchiver , CoreData 和其他的存储方案: https://forums.swift.org/t/nskeyedarchiver-coredata-and-other-storage-solutions/
2.利用NSKeyedArchiver对自定义对象进行归档。
NSManagedObject子类 前言 iOS应用数据存储的常用方式 1、preference偏好设置 2、XML属性列表归档(plist) 3、使用Keychain 存储,例如存储UUID来解决设备唯一标识符获取方案 4、NSKeyedArchiver boolValue]; } 1.4 存储自定义类型对象到NSUserDefaults 自定义的类型需要转成NSData再存 setObject NSData *data = [NSKeyedArchiver
其中,iOS中的存储方式主要包括以下六类: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 手动存放沙盒 一、沙盒机制 2.3 NSKeyedArchiver(归档) 之前说了,不管是NSUserDefaults 或者是 plist 都不能对自定义的对象进行存储,OC提供了解归档恰好解决这个问题。 使用 需要把对象归档是调用NSKeyedArchiver的工厂方法 archiveRootObject: toFile: 方法。 self.avatarView.image; 4 person.name = self.nameField.text; 5 person.age = [self.ageField.text integerValue]; 6 [NSKeyedArchiver
NSUserDefaults standardUserDefaults]; Person *person = [[Person alloc] init]; NSData *personData = [NSKeyedArchiver