开发中会遇到一些数据的存储,有些人可能会说了,前段开发不需要什么数据存储,应该交给后台来做,我们只需要跟后台进行交互就好了,但是一些轻量级的数据,还是需要我们自己来存储的,比如登录状态,登录成功后的一些常用数据:userID,userName,headViewUrl,电话号码啊等等,一些操作需要用到的数据,都是需要我们来进行存储的,这样可以减少一些服务器压力,设想一下,如果所有的信息都需要网络请求,拂去其压力该的多大。好了,废话不多说,我们来说说,iOS开发中的数据存储。
iOS开发中遇到一些轻量级的数据,通常是由我们存储到本地的。常用到的数据存储(这里统统指的是轻量级数据)的方式一般有:NSUserDefault、Keychain、Plist、CoreData、FMDB、归档等方式。比如用户ID,登录状态、username等不是隐私性特别强的话,一般都会用NSUserDefault,比如电话号码之类稍微有点关于用户隐私的用KeyChain存储,等等。每种方式都有每种方式的特点,这里我们说一下plist存储。
应用场景:这两天在做一个应用,其中有这样一个场景是,我们要存储多条数据,这多条数据key值相同,每次存储不能覆盖。刚一开始我想用NSUserDefault来做,但是好像不太符合NSUserDefault存储的特点,不是很方便,因为需求有点类似于数据库中的表。所以就想到了plist来做。
plist文件可以手动创建也可以代码创建,我这里是代码创建的,因为我要动态的修改plist,类似于数据库中的增删改查。如果你已经有了固定的数据,可以xcode种创建plist,然后添加你的数据,在需要的地方进行读取,我这边因为数据不固定,所以用代码的方式创建。
1)在你需要添加数据的地方写:
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [path objectAtIndex:0];
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"notes.plist"];
我这边是字典的方式存储多条数据,所以,先用字典存储,然后将字典放到数组中,将数组写入plist文件,这样就可以保证多条存储,存储的数据也不会将上一条数据覆盖。
//赋值
NSMutableDictionary * newsDict = [NSMutableDictionary dictionary];
[newsDict setObject:self.titleFiled.text forKey:@"title"];
[newsDict setObject:self.notestextView.text forKey:@"notes"];
[newsDict setObject:[NSString currtenDate] forKey:@"date"];
[self.notesDatas addObject:newsDict];
//数据写入plist
[self.notesDatas writeToFile:plistPath atomically:YES];这里将数组写入了文件。
之后你会发现一个问题,在当前界面操作时没有问题,去别的界面读数据也没问题,但是,在重新返回本界面做写入操作时,你会发现这次上次写入的数据没有了。原因时,这边的数组每次走都进行了初始化。所以每次都是一个全新的数组,但是初始化还不能省略。解决办法是什么呢?
2)我每次这进入这个界面时先将文件中的数据全部取出来,放到self.notesDatas这个数组中,然后写入时就会将所有的数据写入了。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationItem.title = @"Add";
//下面是读取数据
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path1 = [pathArray objectAtIndex:0];
NSString *myPath = [path1 stringByAppendingPathComponent:@"notes.plist"];
NSMutableArray*data2 = [[NSMutableArray alloc] initWithContentsOfFile:myPath];
self.notesDatas = [NSMutableArray array];
if (data2.count) {
[self.notesDatas addObjectsFromArray:data2];
}
[self createUI];
}
3)展示数据
两一个控制器内用tableview展示存储的数据,这里的操作跟上一步取数据是一样的,如果存的字典,就用字典接收,如果是数组就用数组接受,这里附上代码,需求不同代码也不同,所以只是参考,按照自己的需求改变。
-(void)viewWillAppear:(BOOL)animated{
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path1 = [pathArray objectAtIndex:0];
NSString *myPath = [path1 stringByAppendingPathComponent:@"notes.plist"];
NSMutableArray*data2 = [[NSMutableArray alloc] initWithContentsOfFile:myPath];
self.notesDatas = [NSMutableArray array];
[self.notesDatas addObjectsFromArray:data2];
[self.tableView removeFromSuperview];
[self.imageVIew removeFromSuperview];
if (data2.count) {
[self createTableview];
}else{
[self createimgeView];
}
}