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可以将下载的图片或文件保存在本地。