美文网首页
iOS的数据储存与传递方式

iOS的数据储存与传递方式

作者: 4c8ba49dc980 | 来源:发表于2016-10-18 14:30 被阅读365次

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

相关文章

网友评论

      本文标题:iOS的数据储存与传递方式

      本文链接:https://www.haomeiwen.com/subject/ryctuttx.html