数据的持久化

1、沙盒目录

###一、基本概念:       IOS应用程序只能在为该改程序建立的文件系统中读取文件,不能够去其它地方访问,此区域被成为沙盒.因此全部的非代码⽂件都要保存在此,例如图像、图标、声音、映像、属性列表、⽂本文件等.sql

二、规则

  • 每一个应⽤程序都有⾃己的存储空间
  • 应⽤程序不能翻过⾃己的围墙去访问别的存储空间的内容
  • 应用程序请求的数据都要经过权限检测,假如不符合条件的话,不会被放⾏

###三、目录结构      状况下,每一个沙盒含有3个文件夹:Documents, Library 和 tmp。由于应用的沙盒机制,应用只能在⼏个目录下读写⽂件。数据库

Documents:苹果建议将程序中创建的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;(iTunes备份和恢复的时候会包含此目录)Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下⽂件不会在应⽤用退出删除
tmp: 提供⼀个即时建立临时文件的地方。(系统重启后会删除tmp里的全部文件)编程

//沙盒目录路径数组

NSString *homePath =  NSHomeDirectory();

//Documents目录缓存

NSString *documentsPath = [homePath  
     stringByAppendingPathComponent:@"Documents"];  
// 获取Documents目录
- (NSString *)docPath {
  
/** NSSearchPathForDirectoriesInDomains: 获取文件目录路径
   
   参数一: 要获取的目录名称
   参数二: 要查找的目录的主目录(沙盒目录)
   参数三: 是否返回完整的路径
**/
  
return [NSSearchPathForDirectoriesInDomains  
(NSDocumentDirectory, NSUserDomainMask, YES)  
  lastObject];
}

2、文件管理

###一、文件操做 1.获取程序的Home路径
2.获取Documents路径
3.获取Library路径
4.获取缓存路径
5.获取tmp路径
6.文件写⼊
7.文件读取
8.删除文件数据结构

###二、建立目录 文件管理类:用于管理(增、删、改、查)沙盒目录文件编程语言

NSFileManager *fileManager = [NSFileManager   
                             defaultManager];
NSString *dataPath = [[self docPath]  
     stringByAppendingPathComponent:@"Datas"];
    
NSError *error = nil;

使用NSFileManager建立目录函数

BOOL isCreated = [fileManager createDirectoryAtPath:  
dataPath withIntermediateDirectories:NO attributes:nil error:&error];
    
if (isCreated) {
    NSLog(@"建立目录成功");
    } else {   
      NSLog(@"建立目录失败");
    }
    
    NSLog(@"%@",dataPath);
}

根据指导的路径移除、移动文件编码

//移除文件
BOOL isRemoved = [fileManager removeItemAtPath:  
                 filePath error:nil];   
//移动文件 
BOOL isMoved = [fileManager moveItemAtPath:  
               filePath toPath:toPath error:nil];

3、属性列表

    使用属性列表持久化数据对象⾮常方便,只要是数组或者字典中包含的对象是特定的可序列话对象(NSArray,NSMutableArray,NSDictionary, NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就能够直接经过NSDictionary和NSArray的实例方法将其保存到属性列表或者从属性列表中读取他们。atom

将字典数据写入plist文件

BOOL isSuccess_1 = [userInfos writeToFile:filePath   
                   atomically:YES];  
NSString *filePath_array = [docPath  
 stringByAppendingPathComponent:@"infos.plist"];  
 
NSArray *infos = @[@"1",@"2",@"3"];
// 数据同步(即便更新数据)
[userDefaults synchronize];
    
// 取值
id value = [userDefaults objectForKey:@"id"];
    NSLog(@"%@",value);
    
// 修改
[userDefaults setObject:@2000 forKey:@"id"];
[userDefaults synchronize];

4、数据归档

一、概述

    对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径读取文件的内容(也称为接档,反序列化),(对象归档的⽂件是保密的,在磁盘上没法查看⽂件中的内容,而属性列表是明文的,能够查看)。

二、对象归档方式

1.简单归档
2.对多个对象进⾏行归档
3.对自定义对象进行归档
###三、示例代码 归档自定义的对象的前提是要实现 <NSCoding> 协议,对象的属性进行编码和解码

归档(编码保存):

BOOL isSuccess = [NSKeyedArchiver archiveRootObject:user toFile:filePath];
if (isSuccess) {
        
    NSLog(@"成功");
    } else {
        
      NSLog(@"失败");
    }
 NSLog(@"%@",docPath);

将数据以二进制的形式保存,经常使用的NSString、NSArray、NSDictionary.... 能够直接归档保存,由于它们都实现了 <NSCoding> 协议 :NSKeyedArchiver

解归档(读取解码):NSKeyedUnarchiver

id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
User *user_ = (User *)object;  

NSLog(@"%@  %@",user_.userName, user_.password);

5、SQLite

一、概述

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。 ###二、三个阶段 (1)文件管理阶段
(2)文件系统阶段
(3)数据库管理系统阶段
###三、数据库模型 (1)层次模型
(2)网状模型
(3)关系模型
###四、SQLite      SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特色是高度便携、使用结构紧凑、⾼效、可靠。与其余数据库管理系统不一样,SQLite的安装和运行⾮常简单,在⼤多数状况下, 只要确保SQLite的⼆进制⽂件存在,便可开始建立、链接和使用数据库。若是您正在寻找一个嵌入式数据库项目或解决方案, SQLite是绝对值得考虑。
###五、SQL语言     结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是⼀种数据库查询和程序设计语言,⽤于存取数据以及查询、更新和管理关系数据库系统。
###六、SQLite的数据类型 (1)NULL,值是NULL
(2)INTEGER,值是有符号整形,根据值的⼤小以1,2,3,4,6或8字节存放
(3)REAL,值是浮点型值,以8字节IEEE浮点数存放
(4)TEXT,值是⽂本字符串,使⽤数据库编码(UTF-8,UTF-16BE或者UTF-16LE)存放
(5)BLOB,只是⼀个数据块,彻底按照输⼊存放(即没有准换)
###七、数据库的操做 1.建立数据库
2.建立表
3.删除表
4.添加数据

#数据库表中插入数据
- (void)insertValues {
    
    NSString *userID = @"100015";
    NSString *userName = @"李杨";
    int age = 20;
    
    NSString *sql = [NSString stringWithFormat:@"INSERT INTO User('userID','userName','userAge') VALUES('%@','%@',%d)",userID,userName,age];
    
 // sqlite3_exec() 执行 sql 函数
    int result = sqlite3_exec(_sqliteDB,[sql UTF8String],NULL,NULL,NULL);
    
    if (result == SQLITE_OK) {
        
        NSLog(@"插入数据成功");
    } else {
        
        NSLog(@"失败");
    }
}

5.查询数据

//建立sql语句结构体指针(能够理解为sql语句对象)
    sqlite3_stmt *_stmt;
    
    // NSString *sql = @"SELECT *FROM User";
    
    NSString *key = @"张";
    NSString *sql = [NSString stringWithFormat:@"SELECT *FROM User WHERE userName LIKE '%%%@%%'",key];
    
    
//编译查询语句
    int result = sqlite3_prepare_v2(_sqliteDB,[sql UTF8String],-1,&_stmt,NULL);
    
    if (result == SQLITE_OK) {
        NSLog(@"sql语句编译经过");
        
         NSMutableArray *users = [NSMutableArray array];
        
//执行查询语句,== SQLITE_ROW 表示还有下一条数据
        while (sqlite3_step(_stmt) == SQLITE_ROW) {

把查询到的数据保存为 model 对象

User *user = [[User alloc] init];
user.userID = userID_str;
user.userName = userName_str;
user.userSex = userSex_str;
[users addObject:user];
            
NSLog(@"%@, %@, %d,%@",userID_str,userName_str,userAge,userSex_str);

6.更新数据

NSString *userSex = @"男";
NSString *userName = @"电风扇";
NSString *sql = [NSString stringWithFormat:@"UPDATE User SET userSex = '%@' WHERE userName = '%@'",userSex,userName];
    
// sqlite3_exec() 执行 sql 函数
int result = sqlite3_exec(_sqliteDB,[sql UTF8String],NULL,NULL,NULL);

7.删除数据

NSString *userName = @"电风扇";
NSString *sql = [NSString stringWithFormat:@"DELETE FROM User WHERE userName = '%@'",userName];
    
// sqlite3_exec() 执行 sql 函数
int result = sqlite3_exec(_sqliteDB,[sql UTF8String],NULL,NULL,NULL);
相关文章
相关标签/搜索