简单的数据存储——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));

}

你可能感兴趣的:(NSUserDefaults)