当前位置: 移动技术网 > IT编程>移动开发>IOS > 详解IOS四种保存数据的方式

详解IOS四种保存数据的方式

2019年07月24日  | 移动技术网IT编程  | 我要评论

bt63,心墙 伴奏,肯德基半价全家桶

在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来接收从数据库取出的字符串。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网