最近在工作中越来越多的接触到本地数据持久化的这个需求,通过自学,看博客,大体上iOS开发里面用于本地数据存储的有NSUserDefalt、NSKeyedArchiver、CoreData、Sqlite。
对于Core Data来说 Sqlite相对于比较轻量级,所以最近一直在研究用Sqlite来做本地数据存储的需求。 提到在iOS开发中使用Sqlite就不得不提到FMDB这个第三方的类库。所以在这里 我稍微说一下FMDB这个第三方类库的使用。
首先本人比较愿意使用CocoaPods这个包管理工具,现在终端里面将FMDB install下来。
然后在Build Phases 里面添加依赖库
然后就可以开始使用FMDB进行本地数据存储的操作啦。
话不多说 上代码。
首先要在你想要进行数据存储的页面的ViewWillAppear方法里面打开数据库
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 打开数据库
[self openDataBase];
}
这是函数里面的代码实现
#pragma mark - 本地数据处理
- (void)openDataBase {
// 获取Document文件在沙盒中的路径
NSString *doc = [NScSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 新建一个plist文件名
NSString *fileName = [doc stringByAppendingPathComponent:@"LFM.sqlite"];
// 获得数据库
FMDatabase *db = [FMDatabase databaseWithPath:fileName];
// 打开数据库
if ([db open]) {
// NSLog(@"%@", @"数据库打开 OK");
}
// 创建表
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS memo (id integer PRIMARY KEY AUTOINCREMENT, title text NOT NULL, test text, time text NOT NULL);"];
if (result) {
NSLog(@"%@",@"创建表成功");
} else {
NSLog(@"%@",@"创建表失败");
}
self.db = db;
}
接着是插入你想要存储的数据
// 插入数据
- (void)insertData {
NSString *title = self.titleText.text;
NSString *test = self.testView.text;
[self.db executeUpdate:@"INSERT INTO memo (title, test, time) VALUES (?,?,?);",title, test, self.currentTime];
}
这样就可以了。十分简单,但是在你离开当前界面的时候别忘了关闭数据库哦。
[self.db close];
然后在读取方面呢,也很简单。
首先 还是在你想要读取数据的界面里面先打开数据库
接着:
- (void)loadLocalData {
_dataArray = [[NSMutableArray alloc] init];
// 读取数据库中的数据
FMResultSet *data = [self.db executeQuery:@"select * from memo;"];
// NSLog(@"%@", data);
while ([data next]) {
NSString *test = [data stringForColumn:@"test"];
NSString *title = [data stringForColumn:@"title"];
NSString *time = [data stringForColumn:@"time"];
NSNumber *cid = [NSNumber numberWithInt:[data intForColumn:@"id"]];
NSMutableDictionary *infoDict = [[NSMutableDictionary alloc]init];
[infoDict setValue:title forKey:@"memoTitle"];
[infoDict setValue:test forKey:@"memoTest"];
[infoDict setValue:cid forKey:@"id"];
[infoDict setValue:time forKey:@"dateStr"];
//封装数据模型
FMMemoModel *model = [[FMMemoModel alloc] initWithDataDic:infoDict];
//将数据模型放入数组中
[_dataArray addObject:model];
}
}
就这样子 就将数据取出来了 并且封装到了已经写好的Model里面 接着就可以使用了 是不是特别的简单呢?
接下来 还有几个小坑 或者说是你可能想要问的小疑问。
Q—如果如果我想更新一条数据的话 我该怎么做?
A—你需要写更新的Sql语句 而不是重新插入一条数据
NSString *title = self.titleText.text;
NSString *test = self.testView.text;
// 通过这条数据在表中的id来定位修改这条信息
[self.db executeUpdate:@"update memo set title=?,test=?,time=? where id=?;",title, test, self.currentTime, self.cid];
Q—如果我想删除一条数据呢?
A—那你需要写删除的Sql语句 也是通过id这个标识来进行删除操作
Q—如果我想在表中新加一条属性怎么办?
A—那你就需要先将整个表删掉 然后再从新建一张表,所以我建议你在建表的时候就好好考虑清楚,你都需要保存哪些属性。
以上的这些就是我对使用FMDB这个第三方类库进行数据存储的一些小的流程分析,有不明白的地方可以私信我,或者在下边评论里面提出问题。谢谢大家给个赞哦。