美文网首页
iOS中常用数据持久化总结(转)

iOS中常用数据持久化总结(转)

作者: 冰land | 来源:发表于2017-11-06 17:42 被阅读11次

    转自:哈哈大p孩 http://www.jianshu.com/p/aa78b21296ea

    在项目中我们常需要根据需求存储一些信息,而数据持久化就显得非常必要了,在这里我对数据持久化做个总结。
    在说数据持久化之前,先提一个概念,沙盒。相信大家对他并不陌生,iOS程序默认情况下只能访问程序自己的目录,这个目录被称为沙盒。
    沙盒路径下有好几个文件夹,每个文件夹都有自己的特性。详细代码如下:

    
    //存放应用程序的源文件,app
        NSString *pathOne = [[NSBundle mainBundle] bundlePath];
        NSLog(@"%@", pathOne);
    
        //最常用的目录Documents,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据。
        NSString *pathTwo = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        NSLog(@"%@", pathTwo);
    
        //caches:iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。Preferences:NSUserDefaults中存储,iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。
        NSString *pathThree = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
        NSLog(@"%@", pathThree);
    
        //iTunes不会同步此文件夹,系统可能在应用运行时就删除该目录下的文件,所以此目录适合应用中的一些临时文件,用完就删除
        NSString *pathFour = NSTemporaryDirectory();
        NSLog(@"%@",pathFour);
    
    

    1.plist文件

    plist文件是将某些特定的类,通过xml的方式保存在目录中。
    可以被序列化的类型只有如下几种:NSArray NSMutableArray NSDictionary NSMutableDictionary NSData NSMutableData NSString NSMutableString NSNumber NSDate

    详细代码如下:

    
        //1.获取文件路径
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        NSString *fileName = [path stringByAppendingPathComponent:@"fei.plist"];
        //2.存储
        NSArray *array = @[@"1",@"2",@"3",@"4"];
        [array writeToFile:fileName atomically:YES]; //atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
    
        //3.读取
        NSArray *result  = [NSArray arrayWithContentsOfFile:fileName];
        NSLog(@"%@", result);
    
    

    2.NSUserDefaults

    先上代码,大家先看一下:

    
        //1.获得NSUserDefaults文件
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        //2.向文件中写入内容
        [userDefaults setObject:@"狮子" forKey:@"猫科动物"];
        [userDefaults setBool:YES forKey:@"公的母的"];
        [userDefaults setInteger:5 forKey:@"多大"];
        //3.立即同步
        [userDefaults synchronize];
        //4.读取文件
        NSString *name = [userDefaults objectForKey:@"猫科动物"];
        BOOL sex = [userDefaults boolForKey:@"公的母的"];
        NSInteger age = [userDefaults integerForKey:@"多大"];
        NSLog(@"%@, %d, %ld", name, sex, age);
    
    

    一般在这里保存应用程序的配置信息的(我们代驾项目中是把个人信息存储在这里),一般不要在这里保存其他数据。
    如果这里你没有调用synchronize方法的话,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

    3.NSKeyedArchiver

    归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。
    1.需要在定义的类中实现NSCoding协议 ,一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。

    
    //实现协议的方法
    //解档
    - (instancetype)initWithCoder:(NSCoder *)aDecoder {
        if ([super init]) {
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeIntegerForKey:@"age"];       
        }
        return self;
    }
    
    //归档
    - (void)encodeWithCoder:(NSCoder *)aCoder {
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeInteger:self.age forKey:@"age"];
    }
    
    

    注意:如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。
    2.接下来是使用,将创建类的对象的数据进行归档。

    
    NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"maozhuxi.data"];
        Person *person = [[Person alloc] init];
        person.name = @"毛主席";
        person.age = 50;
        //将对象归档是调用NSKeyedArchiver的工厂方法archiveRootObject
        [NSKeyedArchiver archiveRootObject:person toFile:file];
    
    

    然后在我们需要的地方解档取出这些数据

    
        //需要从文件中解档对象就调用NSKeyedUnarchiver的一个工厂方法 unarchiveObjectWithFile:即可。
        NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"maozhuxi.data"];
        Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
        if (person) {
            NSLog(@"name == %@", person.name);
            NSLog(@"age == %ld", person.age);
        }
    
    

    4.FMDB

    大数据的存储我们一般用FMDB,比如聊天中的信息一般是用FMDB存储的(融云第三方就是这么存储的。。。),他是在sqlite的基础上进行封装的,因为sqlite使用起来不是很好使,所以iOS的大神们封装了这个FMDB,我也在这里记录一下用法以及心得。
    FMDB的下载地址:https://github.com/ccgus/fmdb
    1.将FMDB第三方导入到工程中
    2.在工程文件中导入FMDB.h
    3.创建数据库,并建表格。如下面代码

    
    - (void)openDataBase {
      //1.设置文件名
        NSString *filename = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"xiaoping.db"];
        //2.打开数据库文件,如果没有会自动创建一个文件
        _database = [FMDatabase databaseWithPath:filename];
        if (![_database open]) {
            NSLog(@"数据库打开失败");
        }else {
            [_database executeUpdate:@"create table myTable(name,age,sex)" ];
        }
        [_database close];
    
    }
    
    

    在指定路径下创建一个数据库文件,并在其中创建一个表格,分别包含三个属性。
    4.向表格中添加数据,如下代码:

    
    - (void)addSQL {
        [_database open];
        BOOL b = [_database executeUpdateWithFormat:@"insert into myTable(name,age,sex) values (%@,%d,%@);",@"junjie",23,@"man"];
       BOOL c = [_database executeUpdateWithFormat:@"insert into myTable(name,age,sex) values (%@,%d,%@);",@"xiaohong",22,@"woman"];
        [_database close];
        b ? NSLog(@"junjie success"):NSLog(@"junjie fail");
        c ? NSLog(@"xiaohong success"):NSLog(@"xiaohong fail");
    }
    
    

    在这里添加了两条数据,分别是junjie和xiaohong,注意一下语法。
    5.查询表格中的数据,如下代码:

    
    - (void)requireSQL {
        //取得资料
        [_database open];
        FMResultSet *rs = [_database executeQuery:@"select * from myTable"];
        while ([rs next]) {//遍历一下
            NSString *name = [rs stringForColumn:@"name"];
            int age = [rs intForColumn:@"age"];
            NSString *sex = [rs stringForColumn:@"sex"];
            NSLog(@"name == %@, age == %d, sex == %@",name, age, sex);
        }
    
        //这里是找出对应的人的对应信息
        NSString *junjie_sex = [_database stringForQuery:@"select sex from myTable where name = ?",@"junjie"];
        NSString *xiaohong_sex = [_database stringForQuery:@"select sex from myTable where name = ?",@"xiaohong"];
        NSLog(@"junjie_sex == %@", junjie_sex);
        NSLog(@"xiaohong_sex == %@", xiaohong_sex);
        [rs close];
        [_database close];
    }
    
    

    6.删除操作,代码如下:

    
    - (void)delegateSQL {
        [_database open];
        [_database executeUpdate:@"delete from myTable where name = 'junjie'"];
         [_database close];
    }
    
    

    上面,除了查询是executeQuery语句,其余全是executeUpdate语句。

    5.CoreData

    相关文章

      网友评论

          本文标题:iOS中常用数据持久化总结(转)

          本文链接:https://www.haomeiwen.com/subject/pwnlmxtx.html