• IOS开发数据存储篇—IOS中的几种数据存储方式


    IOS开发数据存储篇—IOS中的几种数据存储方式

    发表于2016/4/5 21:02:09  421人阅读

    分类: 数据存储

    在项目开发当中,我们经常会对一些数据进行本地缓存处理。离线缓存的数据一般都保存在APP所在的沙盒之中。一般有以下几种:

    1、PList(XML属性列表)

    在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦

    //写入文件
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [doc stringByAppendingPathComponent:@"myself.plist"];
    NSDictionary *dict = @{@"name": @"yixiang"};
    [dict writeToFile:path atomically:YES];
    //读取文件
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

    2、偏好设置(NSUserDefaults)

    将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息)

    //写入文件
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:@"yixiang" forKey:@"name"];
    [defaults setInteger:27 forKey:@"age"];
    [defaults synchronize];
    //读取文件
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    NSString *name=[defaults objectForKey:@"name"];
    NSInteger age=[defaults integerForKey:@"age"];

    3、归档(NSCoding NSKeyedArchiver NSKeyedUnarchiver)

    因为前两者都有一个致命的缺陷,只能存储常用的类型。归档可以实现把自定义的对象存放在文件中。

    需要保存的对象必须遵守NSCoding协议,并且实现该协议中- (void)encodeWithCoder:(NSCoder )aCoder和 - (id)initWithCoder:(NSCoder )aDecoder方法。

    YXPerson.h文件如下:

    
      @interface YXPerson : NSObject<NSCoding>
      @property(nonatomic,copy) NSString *name;
      @property(nonatomic,assign) int age;
      @end

    YXPerson.m文件如下:

      #import "YYPerson.h"
    
      @implementation YYPerson
      -(void)encodeWithCoder:(NSCoder *)aCoder{
          [aCoder encodeObject:self.name forKey:@"name"];
          [aCoder encodeInteger:self.age forKey:@"age"];
      }
      -(id)initWithCoder:(NSCoder *)aDecoder{
          if (self=[super init]) {
              self.name=[aDecoder decodeObjectForKey:@"name"];
              self.age=[aDecoder decodeIntegerForKey:@"age"];
          }
          return self;
      }
      @end

    在ViewController中对它进行写入和读取

        //写入对象
        YXPerson *p=[[YXPerson alloc]init];
        p.name=@"yixiang";
        p.age=27;
    
        NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *path=[docPath stringByAppendingPathComponent:@"person.yixiang"];
    
        [NSKeyedArchiver archiveRootObject:p toFile:path];
    
         //读取对象
         YXPerson *p=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

    4、SQLITE数据库

    上述三种方法都无法存储大批量的数据,有性能的问题。

    下面简单介绍一下,如何打开数据库,新增一张表格,然后对其进行增删改查的操作。

    - (void)openDB{
        //获取数据库文件路径
        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *fileName = [doc stringByAppendingPathComponent:@"students.sqlite"];
    
        //将OC字符串转换为c语言的字符串
        const char *cfileName = fileName.UTF8String;
    
        //打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)
        int result = sqlite3_open(cfileName, &_db);
        if (result == SQLITE_OK) {//打开成功
            NSLog(@"成功打开数据库");
        }else{
            NSLog(@"打开数据库失败");
        }
    }
    
    
    - (void)createTable{
        //创建表
        const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);";
        char *errmsg= NULL;
        int result = sqlite3_exec(_db, sql, NULL, NULL, &errmsg);
        if (result==SQLITE_OK) {
            NSLog(@"创建表成功");
        }else{
            NSLog(@"创建表失败---%s",errmsg);
        }
    }
    
    
    - (void)insertData{
        //插入数据
        for (int i=0; i<10; i++) {
            //拼接sql语句
            NSString *name = [NSString stringWithFormat:@"yixiangboy--%d",arc4random_uniform(100)];
            int age = arc4random_uniform(20)+10;
            NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student (name,age) VALUES ('%@',%d);",name,age];
    
             //执行SQL语句
            char *errmsg = NULL;
            sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
            if (errmsg) {//如果有错误信息
                NSLog(@"插入数据失败--%s",errmsg);
            }else{
                NSLog(@"插入数据成功");
            }
        }
    }
    
    
    - (void)deleteData{
        //删除age小于15的数据
        NSString *sql = [NSString stringWithFormat:@"DELETE FROM t_student WHERE age<15"];
        char *errmsg = NULL;
        sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
        if (errmsg) {
            NSLog(@"删除数据失败");
        }else{
            NSLog(@"删除数据成功");
        }
    }
    
    - (void)updateData{
        //大于20岁的都置为20岁
        NSString *sql = [NSString stringWithFormat:@"UPDATE t_student set age=20 WHERE age>20"];
        char *errmsg = NULL;
        sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
        if (errmsg) {
            NSLog(@"更新数据失败");
        }else{
            NSLog(@"更新数据成功");
        }
    }
    
    
    - (void)queryData{
        const char *sql = "SELECT id,name,age FROM t_student WHERE age<20";
        sqlite3_stmt *stmt = NULL;
    
        //进行查询前的准备工作
        if(sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL)==SQLITE_OK){//SQL语句没有问题
            NSLog(@"查询语句没有问题");
    
            //每调用一次sqlite3_step函数,stmt就会指向下一条记录
            while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一条记录
                //取出数据
                //(1)取出第0个字段的值(int)
                int ID=sqlite3_column_int(stmt, 0);
                //(2)取出第一列字段的值(text)
                const unsigned char *name = sqlite3_column_text(stmt, 1);
                //(3)取出第二列字段的值(int)
                int age = sqlite3_column_int(stmt, 2);
    
                printf("%d %s %d
    ",ID,name,age);
            }
        }else{
            NSLog(@"查询语句有问题");
        }
    }

    5、FMDB

    FMDB是IOS中一个著名的SQLite数据库操作的开源项目。项目地址为:https://github.com/ccgus/fmdb

    。是对SQLIite数据库的C语言接口进行了一层封装,使其满足面向对象的操作,接口比原生的SQLite接口简洁很多。同时也提供一些多线程,缓存,线程池的功能。以后的博客将进行详细介绍,这里不多说了。

    6、CoreData

    是苹果公司提供的数据持久化的一种方案。以后的博客将进行详细介绍,这里不多说了。

    联系方式

    微博:新浪微博

    博客:http://blog.csdn.net/yixiangboy

    github:https://github.com/yixiangboy

    iOS开发者交流群:180080550
  • 相关阅读:
    kafka的一些坑
    文件上传到七牛云oss并刷新cdn
    docker swarm集群常用操作
    kubernets中jenkins使用清华源加速插件安装
    获取jenkins插件最新版本
    kubeadm安装集群系列-7.部署jenkins
    kubeadm安装集群系列-6.ingress-nginx安装
    docker清理
    kubeadm安装集群系列-5.其他操作
    kubeadm安装集群系列-4.证书更新
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5358710.html
Copyright © 2020-2023  润新知