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
<未完待续。。。>