zoukankan      html  css  js  c++  java
  • 简单的数据存储——plist、NSKeyedArchiver归档、NSUserDefaults(偏好设置)、SQLite(嵌入式数据库)

    数据存储的五种方法:

    1、xml属性列表(plist归档)

    2、NSKeyedArchiver归档(加密形式)

    3、NSUserDefaults(偏好设置)

    4、SQLite(嵌入式数据库)

    5、Core Date(面向对象方式的嵌入式数据库)

    一、plist的读写

    缺点:

    1、明文保存

    2、操作对象有限只有NSArray、NSMutableArray、NSDictionary、NSMutableDictionary支持

    (归档时只要调用对应的writeToFile方法即可,解档调用arrayWithContentsOfFile或dictionaryWithContentsOfFile)

    写:

    1、//获取到Document文件路径

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSString *path = paths[0];

    2、//创建plist文件

    NSString *filename = [path stringByAppendingPathComponent:@“test.plist”];

    3、//建立Dictionary或者NSArray写入

    NSDictionary *dic1 = @{@“name”:@“zhang”,@“age”:@22,@“sex”:@“man”};

    NSDictionary *dic2 = @{@“name”:@“li”,@“age”:@54,@“sex”:@“female”};

    NSDictionary *dic3 = @{@“name”:@“wang”,@“age”:@25,@“sex”:@“man”};

    NSDictionary *dic = @{@“z”:dic1,@“l”:dic2,@“w”:dic3};

    4、//写入到test.plist中

    [dic writeToFile:filename atomically:YES];

    读:

    1、//获取到Document文件路径

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSString *path = paths[0];

    2、//plist文件

    NSString *filename = [path stringByAppendingPathComponent:@“test.plist”];

    3、//读

    NSDictionary *readDic = [NSDictionary dictionaryWithContentsOfFile:filename];

    NSDictionary *person = readDic[@“z”];

    NSString *name = person[@“name”];

    二、NSKeyedArchiver归档(加密形式)

    分为简单归档(针对单个对象,不用设置key)和复杂对象归档(针对多个对象,需要设置不同的key)

    OS X为:NSArchiver 和  NSUnarchiver

    iOS 为:NSKeyedArchiver 和  NSKeyedUnarchiver

    1、简单归档:

    NSString *str = @“hello”;

    //要归档的内容

    //也可以是NSArray *array = @[@“a”,@“b”,@“c”];

    NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSString *path = array[0];

    NSString *filename = [path stringByAppendingPathComponent:@"test.arc"];

    //获得路径

    if(![NSKeyArchiver archiveRootObject:str toFile:filename])

    {

    NSLog(@“archiver failed!”);

    }

    //归档

    (id) st = [NSKeyedUnarchiver unarchiverObjectWithFile:filename];

    //解档

    //(上面的id指任意的对象,可以是NSString,也可以是NSArray);

    2、复杂对象归档(多对象归档)

    //存档地址

    NSString *filename2 = [path stringByAppendingPathComponent:@"test2.arc"];

    归档:

    //设置数据

    int myInt = 31;

    NSString *myString = @"hello”;

    NSNumber *myNumber = @32;

    NSArray *myArray = @[@"ok",@"no",@"byel"];

    NSDictionary *myDic = @{@"dic1":@"a",@"dic2":@"b",@"dic3":@"c"};

    //新建临时存放数据的data

    NSMutableData *data = [[NSMutableData alloc]init];

    //设置存档保存在data对象中

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

    //对对象进行归档,并设置key以便读取

    [archiver encodeInt:myInt forKey:@"int"];

    [archiver encodeObject:myString forKey:@"string"];

    [archiver encodeObject:myNumber forKey:@"number"];

    [archiver encodeObject:myArray forKey:@"array"];

    [archiver encodeObject:myDic forKey:@"dictionary"];

    //结束存档

    [archiver finishEncoding];

    //写入文件

    [data writeToFile:filename2 atomically:YES];

    读档:

    //定义数据

    int myInt2;

    NSString *myString2;

    NSNumber *myNumber2;

    NSArray *myArray2;

    NSDictionary *myDic2;

    //获取到文件,存放在data2中

    NSMutableData *data2 = [[NSMutableData alloc]initWithContentsOfFile:filename2];

    //定义解档data2

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data2];

    //解档并存放在变量中

    myInt2 = [unarchiver decodeIntForKey:@"int"];

    myString2 = [unarchiver decodeObjectForKey:@"string"];

    myNumber2 = [unarchiver decodeObjectForKey:@"number"];

    myArray2 = [unarchiver decodeObjectForKey:@"array"];

    myDic2 = [unarchiver decodeObjectForKey:@"dictionary"];

    //结束解档

    [unarchiver finishDecoding];

    三、NSUserDefaults

    NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.

    1、存数据:

    //将NSString 对象存储到 NSUserDefaults 中

    NSString *passWord = @"1234567";

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

    [user setObject:passWord forKey:@"userPassWord"];

    2、取数据

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

    NSString *passWord = [ user objectForKey:@"userPassWord"];

    //存自定义的数据用NSData

    四、SQLite数据库

    特点:

    1、在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libsqlite3框架基于C语言编写)

    2、建立连接后通常不需要关闭连接(可以手动关闭)

    步骤:(先导入libsqlite3框架)

    1、打开数据库。

    //用sqlite_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。(打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作)

    2、执行SQL语句。

    执行SQL语句包括有返回值的语句和无返回值语句。

    (1)、对于有返回值的语句(如增删改等操作)直接通过sqlite3_exec()函数执行;

    (2)、对于有返回值的语句(如查询操作)则首先通过sqlite3_prepare_v2()执行语法检测,然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite_column_类型名()方法获得对应列的数据,如此反复循环直到遍历完成。最后通过sqlite3_finalize()释放。

    代码:

    1、创建数据库

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];

    NSString *filename = [path stringByAppendingPathComponent:dbName];

    2、打开数据库并判断是否打开

    if (sqlite3_open([filename UTF8String], &database) == SQLITE_OK) {

        NSLog(@"database open success");

    }

    else{

        NSLog(@"database open failure");

    }

    3、处理一个没有返回值的sql语句(如增删改)

    if (sqlite3_exec(database, [sql UTF8String], nil, nil, &error) != SQLITE_OK){

            NSLog(@"%s",error);

    }

    4、处理一个有返回值的sql语句(如查询)

    -(NSArray *)executeQuery:(NSString *)sql{

        NSMutableArray *array = [[NSMutableArray alloc]init];

        sqlite3_stmt *stmt;

        int result = sqlite3_prepare_v2(database, [sql UTF8String], -1, &stmt, NULL);

        if (result == SQLITE_OK) {

            while (sqlite3_step(stmt) == SQLITE_ROW) {

                NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];

                for (int i = 0; i < sqlite3_column_count(stmt); i ++) {

                    NSString *columnName =[NSString stringWithUTF8String:sqlite3_column_name(stmt, i)];

                    NSString *value=[NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, i)];

                    dic[columnName] = value;

                }

                [array addObject:dic];

            }

        }

        return array;

    }

    5、关闭数据库

    if(sqlite3_close(database) != SQLITE_OK){

        NSLog(@"%s",sqlite3_errmsg(database));

    }

  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/durwards/p/4558765.html
Copyright © 2011-2022 走看看