1.沙盒目录
文档目录:Documents/Library(包括Caches/Preferences)/tmp
Documents :保存应用运行时生成的持久化数据,iTUNES会同步备份该目录,可将游戏存档保存在改目录
tmp:保存应用运行时的临时数据,使用完毕后就会删除或者应用运行完毕后,当系统空间不足也会删除,iTunes不会同步数据
Caches:保存应用运行时生成的需要持久化且可再生的数据,比如网络数据请求,应用程序还要负责删除这些文件,iTunes同步不会备份改目录, 一般是存储体积大,不需要备份的非重要数据.
Preference: 保存应用的所有的偏好设置,应用会在该目录中查找应用的设置信息,iTunes会同步备份该目录.
2.沙盒目录的获取方式
Documents:
1.利用沙盒根目录拼接的方式 不建议采用新的操作系统会修改目录名
NSString*home =NSHomeDirectory();
//获得documents文件夹目录
NSString*doc = [homestringByAppendingPathComponent:@"documents"];
//获得文件全路径
NSString*filePath = [docstringByAppendingPathComponent:@"abc.plist"];
NSString*doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];
//获得文件全路径
NSString*filePath = [docstringByAppendingPathComponent:@"abc.plist"];
NSDocumentDirectory:代表Documents目录参数
NSUserDomainMask:代表从用户文件夹下找
NO:表示展开路径用 YES表示不展开路径用~表示
3.存储方式
1.偏好设置:(保存在Preferences)保存用户名,字体大小,是够自动登录,系统设置等
存储:
//将数据保存到偏好设置中,不需要关心路径在哪里,不要保存大数据,比如图片。
//偏好设置对象
NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];
[defaultssetObject:@"jack"forKey:@"name"];
[defaultssetObject:@"rose"forKey:@"password"];
[defaultssetInteger:100forKey:@"age"];
[defaultssetDouble:1.9forKey:@"height"];
[defaultssetBool:YESforKey:@"sex"];
[defaultssetFloat:189.9forKey:@"weight"];
//在ios8之前还有加入下面代码
//立即同步,立即保存数据
[defaultssynchronize];
读取:
//偏好设置对象
NSUserDefaults*defaults = [[NSUserDefaultsalloc]init];
NSString*name = [defaultsobjectForKey:@"name"];
BOOLsex = [defaultsboolForKey:@"sex"];
NSIntegerage = [defaultsintegerForKey:@"age"];
注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入.
[defaults synchornize];
2.plist:(保存在Documents目录下)对象是NSString,NSDictionary,NSArray,NSData,NSNumber等类型可以见对象写入plist表中查看
存储和读取
存储: writeToFile: atomically: 读取: dictionaryWithContentOfFile
3.归档与解档(保存在Documents目录下)对象是NSString,NSDictionary,NSArray,NSData,NSNumber等类型NSKeyedArchiver类来归档解档
1.遵守NSCoding协议,实现协议的两个方法(通常会在模型中设置)
encodeWithCoder(归档),可以使用encodeObject:forKey:方法归档实例变量 存储的时候会调用
initWithCoder(解档),可以使用decodeObject:forKey方法解码实例变量 读取数据的时候调用
/**
*归档时调用
*在这个方法告诉系统
>如何保存对象的属性
>要保存对象的哪些属性
*/
- (void)encodeWithCoder:(NSCoder*)encoder {
[superencodeWithCoder:encoder];
[encoderencodeObject:self.nameforKey:@"name"];
[encoderencodeInt:self.ageforKey:@"age"];
}
/**
*解档时调用
在这个方法告诉系统
>如何读取对象的属性
>对象的哪些属性要读取
当一个对象从文件中加载的时候,都会调用。
*
*/
- (nullableinstancetype)initWithCoder:(NSCoder*)decoder {
if(self= [superinitWithCoder:decoder]) {
self.age= [decoderdecodeIntForKey:@"age"];
self.name= [decoderdecodeObjectForKey:@"name"];
}
returnself;
}
•归档(编码)
HMStudent*student = [[HMStudentalloc]init];
student.name=@"lili";
student.age=18;
student.title=@"开发工程师";
NSString*docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];
NSString*filePath = [docDirstringByAppendingPathComponent:@"stu.data"];
//保存自定对象
// NSKeyedArchiver:归档:就数据保存到文件的过程
[NSKeyedArchiverarchiveRootObject:studenttoFile:filePath];
•恢复(解码)
NSString*docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];
NSString*filePath = [docDirstringByAppendingPathComponent:@"stu.data"];
// NSKeyedUnarchiver:解档:将文件中的数据对入内存中
HMStudent*stu = [NSKeyedUnarchiverunarchiveObjectWithFile:filePath];
如果是归档多个对象可以用NSData数据来做一个临时变量
•归档(编码)
//新建一块可变数据区
NSMutableData*data = [NSMutableDatadata];
//将数据区连接到一个NSKeyedArchiver对象
NSKeyedArchiver*archiver = [[[NSKeyedArchiveralloc]initForWritingWithMutableData:data] autorelease];
//开始存档对象,存档的数据都会存储到NSMutableData中
[archiverencodeObject:person1 forKey:@"person1"];
[archiverencodeObject:person2 forKey:@"person2"];
//存档完毕(一定要调用这个方法)
[archiverfinishEncoding];
//将存档的数据写入文件
[datawriteToFile:path atomically:YES];
•恢复(解码)
//从文件中读取数据
NSData*data = [NSDatadataWithContentsOfFile:path];
//根据数据,解析成一个NSKeyedUnarchiver对象
NSKeyedUnarchiver*unarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];
Person *person1 = [unarchiverdecodeObjectForKey:@"person1"];
Person *person2 = [unarchiverdecodeObjectForKey:@"person2"];
//恢复完毕
[unarchiverfinishDecoding];
•比如对一个Person对象进行深复制
//临时存储person1的数据
NSData*data = [NSKeyedArchiverarchivedDataWithRootObject:person1];
//解析data,生成一个新的Person对象
Student*person2 = [NSKeyedUnarchiverunarchiveObjectWithData:data];
5.coreDate
5.1.coreDate的概念
coreData不是一个数据库,是用于管理对象图的框架,是一个模型层的技术,面向对象的方式存储和管理数据,可以与内存中的数据很好共事,coreData可以吧对象图写入磁盘,从而实现持久化保存.
NSManagedObjectContext对象管理上下文:负责管理模型的对象的集合
NSManagedObjectModel被管理的对象模型:负责管理对象模型
NSPersistentStoreCoordinator存储调度器:负责将数据保存到磁盘的
5.2.多表关联
Type:
toOne:只指向一个对象
toMany:可以包含多个对象(一般是集合类型)
DeleteRule:
ClassRoom.students --> StudentNullify(作废):
Student.classRoom --> ClassRoom Nullify:
房间删除后,房间里的人对象依然在,但人所指向的房间置为空.
ClassRoom.students --> StudentCascade(级联):
Student.classRoom --> ClassRoom Nullify:
房间删除后,房间里的人对象一同被删除.
ClassRoom.students --> StudentDeny(拒绝):
Student.classRoom --> ClassRoom Nullify:
5.3.如何创建
用单例实现三个属性的get方法,给对象管理器写一个分类方法,
实现创建管理对象方法和保存方法
5.4.实现增删改查
1.增
//1.创建联系人对象
ContactsObject*aContact = [ContactsObjectinsertNewObject];
//2.赋值数据对象
aContact.name=self.nameTextFiled.text;
aContact.phone=self.phoneNumber.text;
//汉字转拼音
NSString*namePY = [CommonToolgetPinYinFromString:aContact.name];
aContact.namePY= namePY;
//分组拼音首字母
aContact.sectionName= [namePYsubstringToIndex:1];
//3.保存
[aContactsave];
2.删
//删除数据
ContactsObject*aContact = [self.feResultsVcobjectAtIndexPath:indexPath];
[[HDCoreDataManagersharedInstance].managedObjectContextdeleteObject:aContact];
//保存
[aContactsave];
3.改
4.查
-(NSFetchedResultsController*)feResultsVc{
if(_feResultsVc!=nil) {
return_feResultsVc;
}
//1.查询请求
NSFetchRequest*request = [NSFetchRequestfetchRequestWithEntityName:[ContactsObjectentityName]];
//2.查询条件根据名字和号码升序
NSSortDescriptor*soerDesc = [NSSortDescriptorsortDescriptorWithKey:@"namePY"ascending:YES];
NSSortDescriptor*soreDesc =[NSSortDescriptorsortDescriptorWithKey:@"phone"ascending:YES];
request.sortDescriptors=@[soerDesc,soreDesc];
//实例化
//Request:查询请求
//managedObjectContext:要查询的对象所在的上下文
//sectionNameKeyPath:分组依据
//cacheName:缓存名,不缓存可以为空
//3.实例化查询
_feResultsVc= [[NSFetchedResultsControlleralloc]initWithFetchRequest:requestmanagedObjectContext:[HDCoreDataManagersharedInstance].managedObjectContextsectionNameKeyPath:@"sectionName"cacheName:nil];
//设置代理
_feResultsVc.delegate=self;
//执行查询
[_feResultsVcperformFetch:nil];
//获取没有分组的查询数据
NSArray*results =_feResultsVc.fetchedObjects;
for(ContactsObject*aContactinresults) {
NSLog(@"%@",aContact.name);
}
return_feResultsVc;
}
使用NSFetchedResultsController代理方法 实现增删改查的数据更新
-(void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath*)newIndexPath{
switch(type) {
caseNSFetchedResultsChangeInsert:
[self.tableViewinsertRowsAtIndexPaths:@[newIndexPath]withRowAnimation:UITableViewRowAnimationRight];
break;
caseNSFetchedResultsChangeDelete:
[self.tableViewdeleteRowsAtIndexPaths:@[newIndexPath]withRowAnimation:UITableViewRowAnimationRight];
default:
break;
}
}
谓词就是查询条件
NSPredicate*predicate = [NSPredicatepredicateWithFormat:@"name CONTAINS '1' && %K BETWEEN {%d, %d}",@"age",5,15];
NSArray*result = [personListfilteredArrayUsingPredicate:predicate];
数据传递
一.顺传:
1.storyboard 两个控制器连接
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {
//获得目标控制器
UIViewController*destVc = segue.destinationViewController;
destVc.title= [NSStringstringWithFormat:@"%@联系人信息",sender];
}
2.无连接
2.1有storyboard 直接获取sb箭头指向控制器 push/modal方式跳转
2.2 xib 获取xib里面控制器 push/modal方式跳转
2.3 如果 不能push/modal 就用block/代理/通知让控制器去跳转
2.4代码创建
QDDetailViewController*vc = [[QDDetailViewControlleralloc]init];
vc.delegate=self;
vc.ci1_id=self.ci1_id;
[self.navigationControllerpushViewController:vcanimated:YES];
3.沙盒保存和获取
二.数据回调
1.block,代理,通知
2.标记(选中)模型回调
3.沙盒保存
4.有sb直接获取sb箭头指向控制器 给控制器赋值 然后出栈/dismiss
网友评论