在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. elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系

    .plt的作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址 .rel.dyn重定向表,在程序启动时就需要重定位完成. .rel.plt保 ...

  2. StarWind的安装配置

    将安装包拷贝到本地后,执行以下exe文件,默认下一步,直到安装完成. 需汉化版本则将language_chinese.xml文件拷贝到以下路径: C:\Program Files\StarWind S ...

  3. jquery 隐藏表单元素

    1.html <label for="lbl" >电压等级:</label> <input class="easyui-combobox&q ...

  4. linux之samba与linux权限

    当linux的文件夹或文件为用户或root时,则在window上共享出来的samba是不能进行修改的,当samba设置为 [share]path = /home#available = yes#bro ...

  5. github 上传至远程的过程

    参考网址:http://luolei.org/dotfiles-tutorial/ http://www.ruanyifeng.com/blog/2014/06/git_remote.html     ...

  6. EF初接触01

    自动属性:{get;set} 隐式类型 var, dynamic var:  隐式的类型推断出来,在编译阶段把Var换成对应的实际的类型 所以只应用在编译之间, 在运行阶段是和实际类型意义的 dyna ...

  7. BZOJ 2822: [AHOI2012]树屋阶梯

    Description 求拼成阶梯状的方案数. Sol 高精度+Catalan数. 我们可以把最后一行无线延伸,所有就很容易看出Catalan数了. \(f_n=f_0f_{n-1}+f_1f_{n- ...

  8. phpDocumentor 注释语法详解

    PHPDocumentor是强大的代码注释生成器,本文对各个参数进行了简单地的总结: @abstract-------------使用@abstract标记来声明一个方法,类变量或类必须重新定义子类中 ...

  9. ajax给全局变量赋值问题解决

    $.ajax({ type: "post", //以post方式与后台沟通 url: "./php/chartAjax.php", //与此php页面沟通 da ...

  10. time()函数,dirname(__FILE__) 的使用总结

    time()函数将返回从1970-1-1 0:0:0到当前时间的秒数.(整型) dirname(__FILE__) php中定义了一个很有用的常数,即 __file__ 这个内定常数是当前php程序的 ...