在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题。将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好。下面介绍一下数据保存的方式:

1.NSKeyedArchiver:
采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和
initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。例如对Possession对
象归档保存。

定义Possession:

@interface
Possession:NSObject<NSCoding>{//遵守NSCoding协议

      
NSString *name;//待归档类型

}

@implementation
Possession

-(void)encodeWithCoder:(NSCoder
*)aCoder{

           
[aCoder encodeObject:name forKey:@"name"];

}

-(void)initWithCoder:(NSCoder
*)aDecoder{

           
name=[[aDeCoder decodeObjectforKey:@"name"]
retain];

}

归档操作:

如果对Possession对象allPossession归档保存,只需要NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile:
即可。

NSString *path = [self possessionArchivePath];

[NSKeyedArchiver archiveRootObject:allPossessions toFile: path ]

解压操作:

同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可

allPossessions = [[NSKeyedUnarchiver unarchiveObjectWithFile:path]
retain];

缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。

2.NSUserDefaults:
用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包
括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前
面的类型,才能用NSUserDefaults存储。具体实现为:

保存数据:

NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString
*name =@”default string“;
[defaults setObject:firstName forKey:@"name"];
 
//获得UIImage实例

UIImage *image=[[UIImage
alloc]initWithContentsOfFile:@"photo.jpg"];

NSData *imageData =
UIImageJPEGRepresentation(image, 100);//UIImage对象转换成NSData

[defaults
synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库

读取数据

NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString
*name = [defaults objectForKey:@"name"];//根据键值取出name
NSData *imageData =
[defaults dataForKey:@"image"];
UIImage *Image = [UIImage
imageWithData:imageData];//NSData转换为UIImage

3.
Write写入方式:永久保存在磁盘中。具体方法为:

第一步:获得文件即将保存的路径:

NSArray *documentPaths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
NSUserDomainMask,YES);//使用C函数NSSearchPathForDirectoriesInDomains来获得沙盒中目录的全路径。该函数有三个参数,目录类型、he
domain mask、布尔值。其中布尔值表示是否需要通过~扩展路径。而且第一个参数是不变的,即为NSSearchPathDirectory
。在IOS中后两个参数也是不变的,即为:NSUserDomainMask 和 YES。
NSString *ourDocumentPath
=[documentPaths
objectAtIndex:0];

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

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

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

第二步:生成在该路径下的文件:

NSString *FileName=[documentDirectory
stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名

第三步:往文件中写入数据:

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

最后:从文件中读出数据:

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

4.
SQLite:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。还是一步步来吧!

第一步:需要添加SQLite相关的库以及头文件:在项目文件的Build
Phases下,找到Link Binary Library(ies),添加libsqlite3.0.dylib(libsqlite3.dylib与前者的区别暂时不知,两者应该差不多);在项目文件中头文件或者源文件中添加头文件#import
"/usr/include/sqlite3.h"

第二步:开始使用SQLite:

NSArray
*documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask , YES);
NSString *databaseFilePath=[[documentsPaths
objectAtIndex:0]
stringByAppendingPathComponent:@"mydb"];
//上面两句已经比较熟悉了吧! 
//打开数据库
if
(sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK)

        NSLog(@"sqlite dadabase is opened."); 
}
else{
return;}//打开不成功就返回

在打开了数据库的前提下,如果数据库没有表,那就开始建表了哦!
char *error; 
const char
*createSql="create table(id integer primary key autoincrement, name
text)";
if (sqlite3_exec(database, createSql, NULL, NULL,
&error)==SQLITE_OK) { 
        NSLog(@"create table is
ok."); 
}
else
{
       NSLog(@"error: %s",error);
      
sqlite3_free(error);//每次使用完毕清空error字符串,提供给下一次使用
}

建表完成之后,就开始插入记录:

const char *insertSql="insert into a person (name) values(‘gg’)"; 
if
(sqlite3_exec(database, insertSql, NULL, NULL, &error)==SQLITE_OK)

        NSLog(@"insert operation is
ok."); 
}

else
{
       NSLog(@"error: %s",error);
      
sqlite3_free(error);//每次使用完毕清空error字符串,提供给下一次使用
}

下一步,查询记录:

const char *selectSql="select id,name from a person"; 
sqlite3_stmt
*statement; 
if (sqlite3_prepare_v2(database,selectSql, -1, &statement,
nil)==SQLITE_OK) { 
        NSLog(@"select operation is
ok."); 
}
else
{
       NSLog(@"error: %s",error);
      
sqlite3_free(error);

while(sqlite3_step(statement)==SQLITE_ROW)

int _id=sqlite3_column_int(statement, 0); 
NSString
*name=(char*)sqlite3_column_text(statement, 1); 
NSLog(@"row>>id %i,
name %s",_id,name); 
}
sqlite3_finalize(statement);

最后,关闭数据库:

sqlite3_close(database); 

注意:写入数据库,字符串可以采用char方式,而从数据库中取出char类型,当char类型有表示中文字符时,会出现乱码。这是因为数据库默认使用ascII编码方式。所以要想正确从数据库中取出中文,需要用NSString来接收从数据库取出的字符串。

IOS- 数据存储的更多相关文章

  1. iOS数据存储之对象归档

    iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...

  2. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  3. iOS数据存储类型 及 堆(heap)和栈(stack)

    iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...

  4. IOS数据存储之Sqlite数据库

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发 ...

  5. IOS数据存储之文件沙盒存储

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...

  6. iOS数据存储

    [reference]http://www.infoq.com/cn/articles/data-storage-in-ios 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就 ...

  7. 最全的iOS数据存储方法

    目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...

  8. iOS数据存储-钥匙串存储

    2017.11.20 14:41* 字数 227 阅读 678评论 0喜欢 0 钥匙串介绍   1. 表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样. 2. ...

  9. IOS 数据存储之 FMDB 详解

    FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过 ...

  10. iOS数据存储简要笔记

    1.  数据存储常用的方式 (1)XML 属性列表(plist)归档 (2)preference(偏好设置) (3)NSKeyedArchiver归档(NSCoding) (4)  SQLite3   ...

随机推荐

  1. ajax访问 aspx.cs后台

    --前台$.ajax({ type: "POST", contentType: "application/json", url: "WebForm2. ...

  2. git之create local reposition(创建本地仓库)

    1.创建名为git-reposition的仓库 mkdir home/sunjf/git-reposition 注:home/sunjf可以指定为你想要的路径下面 2.初始化仓库 cd ~/git-r ...

  3. composer环境配置

    一 下载composer.phar http://pan.baidu.com/s/1nuDQBzz cmd命令行切换到composer.phar文件目录下 运行: echo @php "%~ ...

  4. c语言小知识点

    大一时学c语言,总结的一些自己感觉很零碎且容易忘的知识点,不对之处请指正 1.字符串不管中间是否有数值0,结尾一定有数值02.浮点类型的变量存储并不精确3.printf格式串自动右对齐,加负号左对齐4 ...

  5. mysql 在linux 修改账号密码

    1.root用户登录到mysql数据库代码示例:/usr/local/mysql/bin/mysql -u root -p (输入密码进入mysql)2.进入mysql,输入:代码示例:use mys ...

  6. vim编译运行java程序

    想让你的vim可以编译运行java只要在你的配置文件里面加一句: map <F5> :!javac %&&java %:r <CR> 就可以编译运行java了

  7. HTTP及状态码汇总

    什么是HTTP: HTTP(HyperText Transfer Protocol超文本传输协议)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准,为了提供一种发布和接收HTM ...

  8. 粒子系统模块(Particle System Modules40)

    粒子系统模块(Particle System Modules40) 粒子系统模块(忍者飞镖) 粒子系统(忍者飞镖)(Particle System (Shuriken)) 用模块描述粒子一段时间内的行 ...

  9. Ubuntu编译源码程序依赖查找方法

    ubuntu平时编译源码程序的时候会提示缺少相关的库或是头文件,可以按照以下两种方法进行查找,然后再安装相应的软件包. 1.使用apt-file查找头文件 安装apt-file sudo apt-ge ...

  10. ubuntu add application to launcher

    eg. add sublime text to launcher so as to be found by launcher, docky, etc. add a file sudo gedit /u ...