ios开发-数据存储篇(一)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值