码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 学习笔记——0005(数据存储)

时间:2015-10-17 12:05:03      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:


 

先发一个练手的小demo,自己写的简略通讯录,已上传至github

https://github.com/liaoshaolim/addressBook


 

1.NSKeyedArchiver:(归档)


这里用一个添加联系人的例子来说明:

注意:归档形式保存数据,需要该对象遵守NSCoding协议,而且对应的必须提供encodeWithCoder和initWithCoder方法

         因为归档是一次性的,解压也是一次性的,所以小量的ok,如果量大的话,改一个小地方就要归档或解压全部,效率会比较低

//用一个宏来定义存储路径(较好的设计)
#define ContactFilePath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"contacts.data"]
//归档,这里是存储了一个联系人对象的数组
[NSKeyedArchiver archiveRootObject:self.contactArr toFile:ContactFilePath];
//读数据,也是读取数组
_contactArr = [NSKeyedUnarchiver unarchiveObjectWithFile:ContactFilePath];
@interface ContactModel : NSObject<NSCoding>
@property(nonatomic,copy)NSString* name;
@property(nonatomic,copy)NSString* phone;
@end

#import "ContactModel.h"
@implementation ContactModel

//将某个对象写入文件时候会被调用
//在这个方法中需要说明哪些属性需要存储。
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeObject:_phone forKey:@"phone"];
}

//解析对象的时候会被调用
//需要说明需要解析哪些属性
- (id)initWithCoder:(NSCoder *)aDecoder 
{
    if (self = [super init])
    {
        _name = [aDecoder decodeObjectForKey:@"name"];
        _phone = [aDecoder decodeObjectForKey:@"phone"];
    }
    return self;
}
@end

2.NSUserDefaults:

用来保存应用程序设置和属性、用户保存的数据

用户再次打开程序或开机后这些数据仍然存在

NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储

#define UserNameKey @"name"
#define PwdKey @"pwd"
#define RemeberPwdKey @"remeber_pwd"

NSUserDefaults* userDefaults = [NSUserDefaults  standardUserDefaults];
[userDefaults setObject:_nameField.text forKey:UserNameKey];
[userDefaults setObject:_pwdField.text forKey:PwdKey];
[userDefaults setBool:_remeberSwitch.isOn forKey:RemeberPwdKey];
[userDefaults synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];//可以看出来,这是一个单例模式
_remeberSwitch.on = [userDefaults boolForKey:RemeberPwdKey];
if (_remeberSwitch.isOn)
{
_pwdField.text = [userDefaults valueForKey:PwdKey];
_loginBtn.enabled = true;
}

3.写到磁盘

①:获得文件即将保存的路径:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask,YES);//这三个参数几乎一直是这样的
NSString *ourDocumentPath =[documentPaths objectAtIndex:0];//建议还是用宏来表示

还有一种方法是使用NSHomeDirectory函数获得sandbox的路径。

具体的用法为:NSString *sandboxPath = NSHomeDirectory();

不能在sandbox的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如Documents,Library或者temp。
NSString *documentPath = [sandboxPath
            stringByAppendingPathComponent:@"Documents"];//将Documents添加到sandbox路径上,具体原因前面分析了!

这两者的区别就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全。因为该文件目录可能在未来发送的系统上发生改变。

②:生成在该路径下的文件:

NSString *FileName = [ourDocumentPath stringByAppendingPathComponent:@"myFile"];

③:往文件中写数据:

NSData data1 = ...

[data writeToFile:FileName atomically:YES];//将NSData类型对象data写入文件,文件名为FileName

④:从文件中读数据:

NSData data2 = [NSData dataWithContentsOfFile:FileName options:0 error:NULL];//从FileName中读取出数据

4. SQLite

SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。

这里推荐一个第三方库 FMDB

这里直接贴上一大神的总结http://blog.devtang.com/blog/2012/04/22/use-fmdb/

5.core data

这个目前用的不多,等以后总结出来再补上来。如果有熟悉的大神,欢迎交流!

 


 

iOS 学习笔记——0005(数据存储)

标签:

原文地址:http://www.cnblogs.com/amazinglin/p/4887134.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!