当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS 数据存储

iOS 数据存储

2018年12月26日  | 移动技术网移动技术  | 我要评论

ios 数据存储


1.plist文件存储

ios中手机应用数据存储是保存在手机里的应用沙盒中的 plist文件存储一般都是存取字典和数组,直接写成plist文件,把它存到应用沙盒当中. 只有在ios当中才有plist存储,它是ios特有的存储方式.
存数据
- (ibaction)save:(id)sender {
- 
    获取沙盒根根路径
    nsstring *homedir = nshomedirectory();

    在某个范围内搜索文件夹的路径.
    directory:获取哪个文件夹
    domainmask:在哪个路径下搜索
    expandtilde:是否展开路径.
    这个方法获取出的结果是一个数组.因为有可以搜索到多个路径.

    nsarray *array =  nssearchpathfordirectoriesindomains(nscachesdirectory, nsuserdomainmask, yes);

    在这里,我们指定搜索的是cache目录,所以结果只有一个,取出cache目录 nsstring *cachepath = array[0];
    拼接文件路径
    nsstring *filepathname = [cachepath stringbyappendingpathcomponent:@"ageplist.plist"];

    想要把这个字典存储为plist文件.
    直接把字典写入到沙盒当中
    用字典写, plist文件当中保存的是字典.
    nsdictionary *dict = @{@"age" : @18,@"name" : @"gaowei"};

    获取沙盒路径
    tofile:要写入的沙盒路径
    [dict writetofile:filepathname atomically:yes];

    用数组写,plist文件当中保存的类型是数组.
    nsarray *dataarray = @[@56,@"asdfa"];
    获取沙盒路径
    tofile:要写入的沙盒路径
    [dataarray writetofile:filepathname atomically:yes];

}

读取数据
- (ibaction)reader:(id)sender {
- 
    这个方法获取出的结果是一个数组.因为有可以搜索到多个路径.
    nsarray *array =  nssearchpathfordirectoriesindomains(nscachesdirectory, nsuserdomainmask, yes);

    在这里,我们指定搜索的是cache目录,所以结果只有一个,取出cache目录
    nsstring *cachepath = array[0];

    拼接文件路径
    nsstring *filepathname = [cachepath stringbyappendingpathcomponent:@"ageplist.plist"];

    从文件当中读取字典, 保存的plist文件就是一个字典,这里直接填写plist文件所存的路径
    nsdictionary *dict = [nsdictionary dictionarywithcontentsoffile:filepathname];

    如果保存的是一个数组.那就通过数组从文件当中加载.
    nsarray *dataarray = [nsarray arraywithcontentsoffile:filepathname];

}

2.偏好设置存储

使用偏好设置存储会将数据存储到应用沙盒的preferences文件下,路径为
~application/0a46ac9f-04c9-4da2-b803-5018a979109a/library/preferences 一般用于存储应用的一些应用设置信息,用户偏好设置
           // 保存用户信息至沙盒
            nsuserdefaults *defaults=[nsuserdefaults standarduserdefaults];

            // 设置需要写入的数据
            [defaults setobject:self.accounttextf.text forkey:azaccountinfo];
            [defaults setobject:self.pwdtextf.text forkey:azpwdinfo];
            [defaults setbool:self.rempwdswitch.ison forkey:azreminfo];
            [defaults setbool:self.autologinswitch.ison forkey:azautologininfo];

            // 立即写入文件
            [defaults synchronize];
取出数据
  // 从沙盒中取出用户保存的设置
    nsuserdefaults *defaults=[nsuserdefaults standarduserdefaults];

  // 通过用户保存的设置进行相应的设置
    self.rempwdswitch.on=[defaults boolforkey:azreminfo];

3.归档

归档一般用于保存自定义的对象
    //获取沙盒临时目录
    nsstring *temppath = nstemporarydirectory();
    nsstring *filepath = [temppath stringbyappendingpathcomponent:@"persion.data"]; 
     // 写入数据
    [nskeyedarchiver archiverootobject:self.contactorarray tofile:filepath];
archiverootobject这个方法底层会去调用保存对象的encodewithcoder方法,去询问要保存这个对象的哪些属性.所以要实现encodewithcoder方法, 告诉其要保存这个对象的哪些属性. encodewithcoder方法在nscoding文件中,如果文件父类是nsobject,还需要继承nscoding @interface azcontactor : nsobject
// 编码
- (void)encodewithcoder:(nscoder *)acoder
{
    [acoder encodeobject:self.contactname forkey:@"name"];
    [acoder encodeobject:self.phonenum forkey:@"num"];
}
可以将文件沙盒路径抽成宏,这样在文件的存取过程中就不会出错
#define azdatapath [nssearchpathfordirectoriesindomains(nslibrarydirectory, nsuserdomainmask, yes).lastobject stringbyappendingpathcomponent:@"contactor.data"]
在取出数据的unarchiveobjectwithfile:方法中,在底层会去调用-(instancetype)initwithcoder:(nscoder *)adecoder方法进行解码,需要重写这个方法对数据进行解析
// 解码
-(instancetype)initwithcoder:(nscoder *)adecoder
{
    if (self=[super init]) {
        self.contactname=[adecoder decodeobjectforkey:@"name"];
        self.phonenum=[adecoder decodeobjectforkey:@"num"];
    }
    return self;
}

// 取出数据
 nsmutablearray *data=[nskeyedunarchiver unarchiveobjectwithfile:azdatapath];

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网