iOS提供本地存储和云存储(iCloud)方式。

本地存储的五种机制:

  • 属性列表(类Android中的XML存储方式):可以将集合对象以键值对的形式读写属性列表(plist)中;
  • NSUserDefaults(类Android中的SharePreferences的存储方式):轻量级的存储机制;
  • 对象归档(类Android中的File序列化存储):可以将对象的状态保存到归档文件中;
  • SQLite数据库存储(类Android中也有SQLite存储):轻量级开源嵌入式数据库,用于保存数据;
  • CoreData:是一种对象关系映射技术(ORM)也是基于SQLite存储的。

 

1.属性列表:

属性列表就是通过plist文件对数据进行存储,plist其实是一种XML文件,在Foundation框架中的数组和字典等可以与属性列表文件互相转换。

属性列表结构:由key/type/value,分别代表存储数据的名称(key)/存储数据的类型(type)/名称对应的值(value),当我们需要读取相应字段(key)的值(value)即可。

写入数据:NSSearchPathForDirectoriesInDomains方法搜索沙盒文件目录,然后stringByAppendingString查找到wy.plist

//设置文件保存的路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    //获取document的路径
    NSString *documentPaths = [paths lastObject];
    //定义路径
    NSString *savePath = [documentPaths stringByAppendingString:@"wy.plist"];
    //开辟存储
    NSMutableDictionary *myData = [[NSMutableDictionary alloc]init];
    //添加数据
    [myData setObject:<#(nonnull id)#> forKey:<#(nonnull id<NSCopying>)#>];
    //保存数据
    [myData writeToFile:savePath atomically:YES];

读出数据:

//通过路径读出文件数据
    NSMutableDictionary *readData = [NSMutableDictionary dictionaryWithContentsOfFile:documentPaths];

 

2.沙盒(SandBox)和归档(Archive)(Android手机存放应用私有文件类似):

沙盒:存放iOS的各个app,每个app是独立存储的,且app之间数据是不能共享的,如要使用其他app的数据,那么需要一些特殊API进行访问。

  • Documents目录:该目录用于存放app所有的资源文件和数据文件,文件夹重化工存放应用程序所有的文件和图片资源;
  • Library目录:存放Preference和Caches目录,Preference是存放应用程序的偏好设置,Caches是存放缓存数据;
  • tmp目录:存放的是临时文件。
NSString *temDir = NSTemporaryDirectory();

归档:将对象写入文件并保存在硬盘中,当再次打开应用时,可以还原对象。达到数据存储的功能(对对象序列化和对象持久化),归档后的数据时加密的,所以读取时需要进行解档操作。

NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"array.archive"];
    BOOL success = [NSArchiver NSArchiveRootObject:data toFile:filePath ];

 

3.SQLite数据库:

  • 创建数据库表:

使用sqlite3_open函数打开数据库;

使用sqlite3_exec函数执行create table语句,创建数据表;

使用sqlite3_close函数关闭数据库表,释放资源

NSString *filePath = [NSHomeDirectory()stringByAppendingString:@"/student.sqlite"];
    sqlite3 *sqlite = nil ;
    int result = sqlite3_open([documentPaths UTF8String], &sqlite);
    if (result != SQLITE_OK) {
        NSLog(@"数据库打开失败!");
        sqlite3_close(sqlite);
        return;
    }
    
    char *error = nil;
    NSString *sql = @"CREATE TABLE IF NOT EXISTS student(usename TEXT primary key,password TEXT,age TEXT)";
    result = sqlite3_exec(sqlite, [sql UTF8String], NULL, NULL, &error);
    if (result != SQLITE_OK) {
        NSLog(@"创建表失败:%s",error);
        return;
    }
    
    sqlite3_close(sqlite);
  • 插入数据:

使用sqlite3_open函数打开数据库;

使用sqlite3_prepare函数对SQL语句进行编译;

使用sqlite3_bind_text函数对数据进行插入;

使用sqlite3_step函数执行SQL插入语句;

使用sqlite3_finalize函数关闭数据库句柄;

使用sqlite3_close函数关闭数据库释放资源。

NSString *filePath = [NSHomeDirectory()stringByAppendingString:@"/student.sqlite"];
    sqlite3 *sqlite = nil ;
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_open([documentPaths UTF8String], &sqlite);
    if (result != SQLITE_OK) {
        NSLog(@"数据库打开失败!");
        sqlite3_close(sqlite);
        return;
    }
    
    char *error = nil;
    
    NSString *sql = @"INSERT INTO student(username,password,age) VALUES(?,?,?)";
    sqlite3_prepare(sqlite, [sql UTF8String], -1, &stmt, NULL);
    sqlite3_bind_text(stmt, 1, [@"wy" UTF8String], -1, NULL);
    
    result = sqlite3_step(stmt);
    
    if (result == SQLITE_ERROR || result == SQLITE_MISUSE) {
        NSLog(@"执行SQL语句失败");
        return;
    }
    sqlite3_finalize(stmt);
    sqlite3_close(sqlite);
  • 查询数据:

使用sqlite3_open函数打开数据库;

使用sqlite3_prepare函数对SQL语句进行编译;

使用循环语句执行sqlite3_step函数进行查询;

使用sqlite3_finalize函数关闭数据库句柄;

使用sqlite3_close函数关闭数据库释放资源。

NSString *filePath = [NSHomeDirectory()stringByAppendingString:@"/student.sqlite"];
    sqlite3 *sqlite = nil ;
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_open([filePath UTF8String], &sqlite);
    if (result != SQLITE_OK) {
        NSLog(@"数据库打开失败!");
        sqlite3_close(sqlite);
        return;
    }
    
    
    NSString *sql = @"SELECT username,password,age FORM student";
    sqlite3_prepare_v2(sqlite, [sql UTF8String], -1, &stmt, NULL);
    
    sqlite3_bind_text(stmt, 1, [@"wy" UTF8String], -1, NULL);
    
    result = sqlite3_step(stmt);
    
    while (result == SQLITE_ROW) {
        char *username = (char *)sqlite3_column_text(stmt, 0);
        //sql针对c结构的数据,所以用char接受赋值之后转成对象
        NSString *userName = [NSString stringWithCString:username encoding:NSUTF8StringEncoding];
        
        //移动游标指向下一条数据
        result = sqlite3_step(stmt);
    }
    sqlite3_finalize(stmt);
    sqlite3_close(sqlite);

4.获取网络资源:

在iOS中获取网络资源,也就是通过网络下载相应文件或图片保存到本地。

  • NSData方法(属于同步的方法):NSData是Object-C的数据类型,是NSObject的一个子类,用于保存数据的一个缓冲区区域,分为不可变缓冲区(NSData)和可变缓冲区(NSMutableData),NSData支持URL方法,从网上下载文件或图片保存到缓冲区中,用于显示。
NSURL *url = [NSURL URLWithString:@"URL"];
    NSData *dataUrl = [NSData dataWithContentsOfURL:url];
  • NSURLRequest方法(异步的方法):
NSURL *url = [NSURL URLWithString:@"URL"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
    [request setURL:url];
    [request setHTTPMethod:@"GET"];
    [request setTimeoutInterval:60];
    
    [NSURLConnection connectionWithRequest:request delegate:<#(nullable id)#>];
  • ASIHttpRequest方法:

第三方网络库ASIHttpRequest可以将下载的图片或文件保存在本地。