iOS 数据存储

iOS应用数据存储常用方式:
1>plist文件存储
2>NSUserDefault(设置存储)
3>SQLite3
4>Core Data

plist文件存储

plist文件存储是将NSString,NSArray,NSDictionary,NSNumber等类型写到文件中
将字典写入文件中

 NSDictionary *plistDic = @{@"arrayA":@[@"1",@"2",@"3"],
                               @"arrayB":@[@"4",@"5",@"6"]};

 [plistDic writeToFile:path atomically:YES];

从文件中读取数据

    //获取plist文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"xxx.plist" ofType:nil];
    NSDictionary *plist = [[NSDictionary alloc] initWithContentsOfFile:path];

NSUserDefault

NSUserDefault主要用来保存一些小数据,比如:用户的偏好设置,用户名密码等

简单数据的读取

//写入数据
[[NSUserDefaults standardUserDefaults] setObject:@"kkk" forKey:@"username"];
[[NSUserDefaults standardUserDefaults] setObject:@"yes" forKey:@"isOpen"];
//读取数据
[[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
[[NSUserDefaults standardUserDefaults] objectForKey:@"isOpen"];

对象的读取
如果对象是NSString,NSDictionary,NSArray,NSNumber等类型,可以直接使用NSKeyedArchiver进行归档 读档
自定义的对象类型需要遵守NSCoding协议次才可以使用NSKeyedArchiver归档

NSCoding协议必须实现的两个协议方法:

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

自定义对象实现NSCoding协议:

Singleton.h

@interface Singleton : NSObject
@property (nonatomic ,copy) NSString *name;
@property (nonatomic ,copy) NSString *age;
+ (instancetype)sharedInstance;
@end

Singleton.m

#import "Singleton.h"

@interface Singleton () <NSCoding>
@end

@implementation Singleton
//单例
+ (instancetype)sharedInstance{
    return [[super alloc] init];
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static Singleton *singleTon;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleTon = [super allocWithZone:zone];  
    });
    return singleTon;
}

//NSCoding协议
- (instancetype)initWithCoder:(NSCoder *)aDecoder{   
    if (self = [super init]) {      
        self.name = [aDecoder decodeObjectForKey:@"name"];      
        self.age = [aDecoder decodeObjectForKey:@"age"];
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder{   
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.age forKey:@"age"];
}
@end

使用NSKeyedArchiver 和 NSKeyedUnarchiver归档 读档

//写入对象
Singleton *singleton = [Singleton sharedInstance];
singleton.age = @"22";
singleton.name = @"kkk";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:singleton];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"Singleton"];

//读取对象
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"Singleton"];
Singleton *singleton = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@",singleton.age);

SQLite数据库

SQLite是一个轻量级、跨平台的关系型数据库,占用资源很少,处理速度相对于其他数据库来讲,比较快。
FMDB以OC的方式封装了SQLite数据库的C语言API,使用起来更加面向对象,省去很多麻烦冗余的C语言代码,github地址:https://github.com/ccgus/fmdb
FMDB三个主要的类:
1>FMDatabase
一个FMDatabase对象就是一个单独的数据库
2>FMResultSet
查询的结果集
3>FMDatabaseQueue
用于多线程中执行多个sql语句

操作数据库主要有三步:

1.打开数据库

 //获取应用程序沙盒Document的路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //拼接完整的数据库路径
    NSString *filePath = [path stringByAppendingPathComponent:@"sqlite.db"];
    //database存在 返回  不存在创建
    _database = [FMDatabase databaseWithPath:filePath];

    if (![_database open]) {

        NSLog(@"数据库打开失败");
    }else{

        NSLog(@"数据库打开成功");
    }

2.操作数据库

创建一张User表,插入一条数据

//创建表
    /*
     Sqlite数据库数据类型:NULL,值NULL
                        INTEGER,值整形
                        REAL,值浮点型值
                        TEXT,值文本字符串
                        BLOB,值数据块,完全按照输入存放
     Sqlite没有单独的布尔存储类型,使用INTEGER作为存储类型,0为false,1为true
     */
    NSString *createSql = @"create table User(name text,age interger,sex interger)";
    BOOL createRes = [_database executeUpdate:createSql];

    if (!createRes) {
        NSLog(@"创建失败");
    }else{
        NSLog(@"创建成功");
    }

    [_database executeUpdate:@"insert into User(name ,age ,sex) values(?,?,?)",@"kkk",[NSNumber numberWithInteger:22],[NSNumber numberWithInteger:1]];

从数据库中查询数据

    FMResultSet *result = [self.database executeQuery:@"select * from User"];
    //遍历结果集result
    while ([result next]) { 
        NSLog(@"%@",[result resultDictionary]);
    }

使用FMDatabaseQueue操作数据库 ,线程更安全

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
[queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    }
}];

3.切记:数据库操作完成之后要关闭数据库

     //关闭数据库
    [_database close];

Core Data

<未完待续。。。>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值