iOS端存储方案
ios数据持久化有几种方式
1.plist
2.NSUserDatefaults(偏好设置)
3.NSKeyedArchiver解归档
4.fmdb(Sqlite的封装)
5.CoreData
6.keyChain(钥匙串,与沙盒无关)
7.文件存储
沙盒
要想在本地存储数据,那就要知道一下什么是应用沙盒 ,其实很好理解应用沙盒就是应用的文件夹,与其他文件系统隔离。每一个iOS应用都有自己的应用沙盒,应用必须待在自己的沙盒里,其它应用不能访问该沙盒。
沙盒目录有以下几个子目录
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据(sdwimage等第三方库的缓存都在这里面)
Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
获取他们的路径
Decumnets目录
沙盒根目录:NSString *home = NSHomeDirectory();
第一种(不建议使用)
NSString *documents = [home stringByAppendingPathComponent:@”Documents”];
第二种
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documents = [array objectAtIndex:0];
第三种
[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]
tmp目录
NSString *tmp = NSTemporaryDirectory();
Library/Caches
第一种
NSString *documents = [home stringByAppendingPathComponent:@“Caches”];
第二种
NSString *a =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES).firstObject;
Library/Preference
通过NSUserDefaults类存取该目录下的设置信息
——————————
plist
-(void)plist{
//获取沙盒目录路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *fileName = [path stringByAppendingPathComponent:@"123.plist"];
NSLog(@"%@",fileName);
//存储字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@”母鸡” forKey:@”name”];
[dict setObject:@”15013141314” forKey:@”phone”];
[dict setObject:@”27” forKey:@”age”];
//最后一个参数是否//atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
//存
[dict writeToFile:fileName atomically:YES];
// //存数组
// NSArray *ar = @[@”1”,@”2”,@”3”,@”4”];
// [ar writeToFile:fileName atomically:YES];
//读取
NSMutableDictionary *Getdic = [NSMutableDictionary dictionaryWithContentsOfFile:fileName];
NSLog(@"%@",Getdic);
// //读取
// NSArray *ar1 = [NSArray arrayWithContentsOfFile:fileName];
// NSLog(@”%@”,ar1);
}
备注:xml只能存储NSArray NSMutableArray NSDictionary NSMutableDictionary NSData NSMutableData NSString NSMutableString NSNumber NSDate
———————
NSUserDefaults
——————
-(void)UserDefaults{
//存
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@”黄渤” forKey:@”影帝”];
[userDefaults setBool:YES forKey:@”男的女的”];
[userDefaults setInteger:40 forKey:@”age”];
//立即同步
[userDefaults synchronize];
//取
NSString *name = [userDefaults objectForKey:@"影帝"];
BOOL sex = [userDefaults boolForKey:@"男的女的"];
NSInteger age = [userDefaults integerForKey:@"age"];
NSLog(@"%@,%d,%ld",name,sex,age);
}
NSKeyedArchiver(解归档)
归档
-(void)KeyedArchiver{
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"huangbo.data"];
UserModel *userModel = [[UserModel alloc]init];
userModel.name = @"黄渤";
userModel.age = 40;
[NSKeyedArchiver archiveRootObject:userModel toFile:file];
}
解档
//解档
-(void)KeyedUnarchiver{
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@”huangbo.data”];
UserModel *usermodel = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
if (usermodel) {
NSLog(@”%@,%ld”,usermodel.name,usermodel.age);
}
}
UserModel类
遵守
.m文件
//解档
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if ([super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
//归档
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
注:如果解归档对象有N多个属性我们可以用Returntiem来实现
SQlite—FMDB
-(void)Fmdb{
YDJlManager *mange = [YDJlManager ydjlManager];
Student *stu = [[Student alloc]init];
stu.studid = @"005";
stu.name = @"胡歌1";
stu.age = @"20";
stu.sex = @"男";
//存
[mange addModel:stu];
//取
NSArray *ar = [mange allModels];
for (Student *s in ar) {
NSLog(@"%@",s.name);
}
//查
BOOL isuid = [mange isExists:@”003”];
NSLog(@”%d”,isuid);
}
YDJIManager类
import
import “Student.h”
@interface YDJlManager : NSObject
+(id)ydjlManager;
//增
-(void)addModel:(Student *)student;
//删
-(void)deleteModel:(Student *)student;
//获取全部
-(NSMutableArray *)allModels;
//查
-(BOOL)isExists:(id)model;
.m文件
import “YDJlManager.h”
import “FMDatabase.h”
@implementation YDJlManager
{
FMDatabase *_fmdb;
NSString *path;
}
+(id)ydjlManager
{
static YDJlManager *_m = nil;
if (!_m) {
_m = [[YDJlManager alloc]init];
}
return _m;
}
(instancetype)init
{
self = [super init];
if (self) {//path:指数据库文件的位置 path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]stringByAppendingPathComponent:@"ceshi.db"];
// NSLog(@”path%@”,path);
_fmdb = [[FMDatabase alloc]initWithPath:path];//打开数据库 //如果这个数据库不存在,则先创建,再打开 //如果已经存在,直接打开供后面使用 BOOL success = [_fmdb open]; if (success) { //如果打开成功,创建数据库表 NSString *sql = @"create table if not exists app(studid varchar(32),name varchar(128),age varchar(256),sex varchar(256))"; if(![_fmdb executeUpdate:sql]) {
// NSLog(@”创建数据失败”);
}
}
}
return self;
}
//添加收藏
-(void)addModel:(Student *)student
{
// NSString *sql = [NSString stringWithFormat: @”insert into app (applicationid,name,iconurl) values (‘%@’,’%@’,’%@’)”,model.applicationId,model.name,model.iconUrl];
// NSLog(@”%@”,sql);
BOOL iscunzai = [self isExists:student.studid];
if (iscunzai==1) {
NSLog(@”已存在不添加”);
}else{
NSString *sql = @”insert into app (studid,name,age,sex) values (?,?,?,?)”;
BOOL success = [_fmdb executeUpdate:sql,student.studid,student.name,student.age,student.sex];
if (success) {
NSLog(@”添加成功”);
}
}
}
//删
-(void)deleteModel:(Student *)student
{
NSString *sql = @”delete from app where studid=?”;
[_fmdb executeUpdate:sql,student.studid];
}
//改
-(void)updateNewName:(NSString )newName andOldName:(NSString )oldName{
NSString *sql = @”update t_student set name = ? where name = ?”;
BOOL result = [_fmdb executeUpdate:sql,newName,oldName];
if (result) {
NSLog(@"修改成功");
}else{
NSLog(@"修改失败");
}
}
//所有数据
-(NSMutableArray *)allModels
{
NSMutableArray *resArr = [[NSMutableArray alloc]init];
NSString *sql = @"select * from app";
FMResultSet *result = [_fmdb executeQuery:sql];
while ([result next]) {
NSString *stid = [result stringForColumn:@"studid"];
NSString *name = [result stringForColumn:@"name"];
NSString *age = [result stringForColumn:@"age"];
NSString *sex = [result stringForColumn:@"sex"];
Student *stuModel = [[Student alloc]init];
stuModel.studid = stid;
stuModel.name = name;
stuModel.age = age;
stuModel.sex = sex;
[resArr addObject:stuModel];
}
return resArr;
}
//查
-(BOOL)isExists:(id)model
{
NSString *stuid;
if ([model isKindOfClass:[Student class]]) {
stuid = [(Student *)model studid];
}
else
{
stuid = model;
}
NSString sql = @”select from app where studid=?”;
FMResultSet *result = [_fmdb executeQuery:sql,stuid];
return [result next];
}@end