UI18_数据持久化
2015-10-19 17:57
155 查看
ViewController.h
ViewController.m
Student.h
Student.m
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @end
ViewController.m
#import "ViewController.h" #import "Student.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // NSLog(@"%@", NSHomeDirectory()); // 程序运行会分配一个沙盒文件, 沙盒文件的文件名每次运行都会变化, 文件夹名只一次有效, 沙盒一般会保存程序的一些信息, 缓存等数据, 还可以进行病毒的测试 // 沙盒里有三个文件夹: Documents, library, tmp // Documents文件夹: 保存用户想要的一些信息, 比如收藏的内容, 设置信息 // library文件夹: 用来保存开发人员存储的一些东西 // caches缓存文件夹: 用来对缓存信息进行存储, 清除缓存就是杀出该文件夹 // Preferences用来保存一些信息, NSUserDefaults创建的plist文件保存在这个文件里 // tmp临时文件夹: 存储临时文件 // NSBundle指的是当前工程的文件夹, 在里面和可以获取图片的信息, 应用程序会在编译的时候把文件变成只读文件, 存入到NSBundle里 // // 1. 把简单的对象存入到本地 // // 简单对象��️: NSString, NSArray... // NSString *str = @"永恒之光, 丝袜的骑士是平原的王者, 罗多克的军士带一块大门板, 极其抗揍, 库吉特的骑兵由于骑马与砍杀的骑兵AI不好所以显得很水, 萨兰德马穆鲁克很牛逼, 能量产, 升级快, 维吉亚的骑兵升级比较快, 兵种比较平衡~"; // // // 1. 先找到目标文件夹的路径Documents // // 参数1: 前往指定文件夹的名, NSDocumentDirectory是Documents用的, 64行, 注意不要和63行搞混. 还可以指定缓存等文件夹 // // 参数2: 文件夹的类型, 用户类型 // // 参数3: YES是绝对路径, 能找到整个路径, NO是相对路径, 只保留了前往的文件夹的名, 前面用~代替 // NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // NSLog(@"%@", sandBox); // // // NSString *sandBoxPath = sandBox[0]; // // 把要保存的内容进行路径的拼接 // NSString *docPath = [sandBoxPath stringByAppendingString:@"/骑马与砍杀.xml"]; // // 把字符串写入本地 // // 参数1: 要写入的文件路径 // // 参数2: 是否保护正在写入的文件 // // 参数3: 编码格式 // [str writeToFile:docPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; // NSLog(@"%@", docPath); // // 把数组对象写入到本地 // NSArray *arr = @[@"萨兰德", @"维吉亚", @"库吉特", @"罗多克", @"斯瓦迪亚", @"卡拉迪亚"]; // // NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES); // NSString *sandBoxPath = sandBox[0]; // // 路径拼接 // NSString *arrPath = [sandBoxPath stringByAppendingPathComponent:@"卡拉迪亚大陆.xml"]; // // 按照指定的文件路径, 数据写入到本地 // [arr writeToFile:arrPath atomically:YES]; // NSLog(@"%@", arrPath); // // // 从本地把数据读出来 // NSArray *receiveArr = [NSArray arrayWithContentsOfFile:arrPath]; // for (NSString *str in receiveArr) { // NSLog(@"%@", str); // } // // // 1. 指定文件保存的沙盒文件路径 // // 2. 拼接要保存的文件路径 // // 3. 根据路径, 把数据进行写入 // // 4. 按照文件路径, 从本地再读取数据 // // // 写一个字典, 然后参照数组的方法, 把字典写入到本地 // // 从本地把字典读出来 // NSDictionary *dic = @{@"精灵": @"阿尔达利亚", // @"蓝国游侠": @"射术无双", // @"红国禁卫": @"打遍天下", // @"绿国大军": @"斧头帮在此", // @"黄色帝国": @"各种标枪"}; // NSArray *dicSandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES); // NSString *dicSandBoxPath = dicSandBox[0]; // NSString *dicPath = [dicSandBoxPath stringByAppendingString:@"列国兵种.plist"]; // [dic writeToFile:dicPath atomically:YES]; // NSLog(@"dic: %@", dicPath); // // 读取 // NSDictionary *recevieDic = [NSDictionary dictionaryWithContentsOfFile:dicPath]; // NSLog(@"%@", recevieDic); // NSUserDefaults *user = [NSUserDefaults standardUserDefaults]; // [user setObject:@"伊斯兰迪尔" forKey:@"非人精灵"]; // NSLog(@"%@", NSHomeDirectory()); // // 从本地读字符串 // NSString *str = [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError **)#>]; // // 复杂对象, 写入到本地 // Student *stu = [[Student alloc] init]; // stu.name = @"伊斯兰迪尔"; // stu.hobby = @"精灵美酒"; // stu.number = @100; // stu.age = 33; // // 归档操作 // // 找沙盒路径 // NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES); // NSString *sandBoxPath = sandBox[0]; // NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"精灵.avi"]; // NSLog(@"%@", docPath); // [NSKeyedArchiver archiveRootObject:stu toFile:docPath]; // // 反归档: 从本地再读出来 // Student *tempStu = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath]; // NSLog(@"%@, %@", tempStu.name, tempStu.number); //// // 把复杂对象放到数组里进行归档和反归档的操作 // Student *stu1 = [[Student alloc] initWithName:@"紫玫" hobby:@"玫瑰" age:18 number:@126]; // Student *stu2 = [[Student alloc] initWithName:@"雪芍" hobby:@"芍药" age:17 number:@109]; // Student *stu3 = [[Student alloc] initWithName:@"玉兰" hobby:@"玉兰" age:19 number:@187]; // Student *stu4 = [[Student alloc] initWithName:@"月桂" hobby:@"雨夜" age:21 number:@137]; // NSArray *arr = @[stu1, stu2, stu3, stu4]; // // 把复杂对象保存到数组中, 然后整体进行归档和反归档的操作 // // NSArray因为本身就签署了NSCoding协议, 所以可以直接进行归档和反归档操作, 自己写的复杂类也必须签NSCoding协议实现方法, 否则就会崩溃 // // // 1. 找路径 // NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // NSString *sandBoxPath = sandBox[0]; // // 2. 给文件拼接路径 // NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"student.plist"]; // // 3. 归档或者写入 // [NSKeyedArchiver archiveRootObject:arr toFile:docPath]; // NSLog(@"%@", docPath); // // // 反归档 // NSArray *tempArr = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath]; // for (Student *stu in tempArr) { // NSLog(@"%@", stu.name); // } // 文件管理 // 1. 找到沙盒路径 NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *sandBOxPath = sandBox[0]; // 创建一个文件管理者 NSFileManager *manager = [NSFileManager defaultManager]; // 要拼接一个文件夹的路径 // 文件夹的名, 没有扩展名 NSString *docPath = [sandBOxPath stringByAppendingPathComponent:@"tianqin"]; // 根据路径创建一个文件夹 [manager createDirectoryAtPath:docPath withIntermediateDirectories:YES attributes:nil error:nil]; NSLog(@"%@", docPath); // 在新创建的文件夹里写入一个txt文本的字符串 NSString *str = @"天琴斩月"; NSString *newPath = [docPath stringByAppendingPathComponent:@"test.txt"]; [str writeToFile:newPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; // 删除缓存文件 NSArray *cacheBox = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cacheBoxPath = cacheBox[0]; // 删除文件夹,文件 BOOL result = [manager removeItemAtPath:cacheBoxPath error:nil]; if (result) { NSLog(@"删除成功"); } else { NSLog(@"删除失败"); } }
Student.h
#import <Foundation/Foundation.h> // 让复杂类写入到本地执行归档和反归档的操作, 只有类签订NSCoding的协议之后, 实现协议方法才能进行归档反归档的操作 @interface Student : NSObject<NSCoding> @property(nonatomic, copy)NSString *name; @property(nonatomic, copy)NSString *hobby; @property(nonatomic, assign)NSInteger age; @property(nonatomic, retain)NSNumber *number; - (instancetype)initWithName:(NSString *)name hobby:(NSString *)hobby age:(NSInteger)age number:(NSNumber *)number; @end
Student.m
#import "Student.h" @implementation Student - (void)encodeWithCoder:(NSCoder *)aCoder; { // 对数据进行编码操作 // 把需要归档的数据进行编码操作, 不需要的就不写了 [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:self.hobby forKey:@"hobby"]; [aCoder encodeObject:self.number forKey:@"number"]; [aCoder encodeInteger:self.age forKey:@"age"]; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if (self) { // 解码操作 // 把解码之后的值赋值给属性 self.name = [aDecoder decodeObjectForKey:@"name"]; self.hobby = [aDecoder decodeObjectForKey:@"hobby"]; self.number = [aDecoder decodeObjectForKey:@"number"]; self.age = [aDecoder decodeIntegerForKey:@"age"]; } return self; } - (instancetype)initWithName:(NSString *)name hobby:(NSString *)hobby age:(NSInteger)age number:(NSNumber *)number { self = [super init]; if (self) { self.name = name; self.hobby = hobby; self.age = age; self.number = number; } return self; } @end
相关文章推荐
- UI17_NetWorkingTool
- OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)的用法
- bluetooth基础知识
- UI17_KVO, 通知中心
- 【issue】"linker command failed with exit code 1" [xcode7]
- QuestionAnsweringSystem技术实现简要分析
- 这个函数的返回 值value的二进制位模式从左到右翻转后的值。
- require
- Ant 的build.xml 详解
- iOS9 UI Tests
- 更改UILabel的字体样式及某段文字中的颜色
- Github push 错误The requested URL returned error: 403 Forbidden while accessing
- iOS多线程编程NSOperation和NSOperationQueue的使用
- 一、ios的通过Xib构建UICollectionView的简单运用
- easyuI企业管理系统-实战七 导航二
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- easyuI企业管理系统-实战六 导航一
- UIScrollView 截图
- 蓝牙(2) Core Bluetooth
- easyuI企业管理系统-实战六 查询功能