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



先发一个练手的小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(数据存储)

时间: 2024-09-30 10:29:35

iOS 学习笔记——0005(数据存储)的相关文章

Android 学习笔记之数据存储SharePreferenced+File

学习内容: Android的数据存储.... 1.使用SharedPreferences来保存和读取数据... 2.使用File中的I/O来完成对数据的存储和读取...   一个应用程序,经常需要与用户之间形成交互...需要保存用户的设置和用户的数据信息...这些都离不开数据的存储...Android的数据采用五种方式来进行存储...在这里就先介绍两种存储方式... 1.使用SharedPreferences存储数据...   对于软件配置参数的保存,Windows系统采用ini文件来进行保存,

ios学习笔记-数据持久化

沙盒 沙盒是一种数据安全策略,只允许自己的应用访问目录.可以使用NSHomeDirectory()获取. ios沙盒下有三个子目录: 1.Documents目录:用于存储比较大的文件活着需要频发女更新的数据,需要持久化的数据.获取代码: NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 2.Library目录:

android菜鸟学习笔记20----Android数据存储(四))Android数据库操作

Android内置了一个名为SQLite的关系型数据库,这是一款轻量型的数据库,操作十分简便.SQLite与别的数据库不同的是,它没有数据类型.可以保存任何类型的数据到你所想要保存的任何表的任何列中.但它又支持常见的类型比如: NULL, VARCHAR, TEXT, INTEGER, BLOB, CLOB...等. 唯一的例外是:integer primary key 此字段只能存储64位整数. 在JAVA项目中,要使用JDBC操作数据库需要加载数据库驱动,连接数据库等操作.Android简化

Redis学习笔记2--Redis数据存储优化机制

1.zipmap优化hash: 前面谈到将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象.省内存的原因是新建一个hash对象时开始是用zipmap来存储的.这个zipmap其实并不是hash table,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销.尽管zipmap的添加,删除,查找都是O(n),但是由于一般对象的field数量都不太多.所以使用zipmap也是很快的,也就是说添加删除平均还是O(1).如果field或者val

android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化

Android内置了PULL解析器的XPP3实现,以及SAX解析器等,可以直接使用PULL或SAX解析XML,直接把JAVA中进行PULL或SAX解析的代码直接拿来用,遗忘的话,可以参考java拾遗1,2,3关于XML的解析: 如有如下XmlUtils类实现PULL方式解析XML到List和序列化List到XML: Student实体类代码: 1 package cn.csc.bean; 2 3 public class Student { 4 5 private String id; 6 7

ios学习笔记——数据持久化

一.沙盒 沙盒目录是一种数据安全策略,很多系统都采用沙盒设计. 沙盒目录设计的原理就是只能允许自己的应用程序访问目录,而不允许其他的应用访问. 1.Documents目录:该目录用于存储非常大的文件或非常频繁更新的数据,能够进行iTunes或iCloud的备份,获取目录位置的代码如下: 1 NSString * pathArr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) la

学习IOS开发UI篇--数据存储

iOS应用数据存储的常用方式 1.lXML属性列表(plist)归档 2.lPreference(偏好设置) 3.lNSKeyedArchiver归档(NSCoding) 4.lSQLite3 5.lCore Data Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该目录 tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除.应用没有运行时,系统也可能会清除该目录下的文件.iTunes同步设备时

iOS学习笔记之UITableViewController&amp;UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全