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));

    }

  • 相关阅读:
    Iterable,Iterator和forEach
    集合的线程安全性
    Servlet生命周期
    JavaWeb应用的生命周期
    将博客搬至CSDN
    (五)新类库的构件
    Python input和print函数
    python----调试
    Excel决定吃什么
    MATLAB—地图
  • 原文地址:https://www.cnblogs.com/durwards/p/4558765.html
Copyright © 2011-2022 走看看