由于iOS中原生的 SQLite API 使用时非常不方便 ,于是就出现了一系列将 SQLite API 进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB是一款简洁易用、轻量级的封装库。
FMDB
:FMDB
是iOS平台的SQLite数据库框架。
FMDB
以OC的方式封装了SQLite的C语言API。
FMDatabase
:一个FMDatabase对象就代表一个单独的SQLite数据库用来执行SQL语句。
FMResultSet
:使用FMDatabase执行查询后的结果集。
FMDatabaseQueue
:用于在多线程中执行多个查询或更新,它是线程安全的。
FMDB
的优点:FMDB
的缺点:FMDB
的作用:将你想要保存的数据保存在本地,下次在进入程序的时候保证你想要的数据能在本地找到你想要的数据,然后对程序中需要赋值的地方进行赋值。
Cocopads
引入 FMDB 库:
pod 'FMDB'
git地址如下:FMDB基础代码
FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句。
FMResultSet
使用FMDatabase执行查询后的结果集。
FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的。
FMDB的使用基于FMDB环境的配置成功,你首先要确认自己的环境配置成功了,即项目中有FMDB这个库。
对数据库中存储的每一个值都有一个类型
NULL
这个值为空值INTEGER
值被标识为整数,依据值的大小可以依次被存储1~8个字节REAL
所有值都是浮动的数值TEXT
值为文本字符串BLOB
值为blob数据
#import "FMDB.h"
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"%@", doc);
NSString *fileName = [doc stringByAppendingPathComponent:@"collectionData.sqlite"];
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]
iPhone会为每一个应用程序生成一个私有目录,这个目录位于:
/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications下,
并随即生成一个数字字母串作为目录名,在每一次应用程序启动时,这个字母数字串都是不同于上一次。
所以通常使用Documents目录进行数据持久化的保存,而这个Documents目录可以通过:
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserdomainMask,YES) 得到。
简单的来说这个方法就是获取一个固定路径的,注意的是:
NSSearchPathForDirectoriesInDomains
方法返回的是一个数组类型的数据,所以这里是获取它返回数组的最后一个元素。
stringByAppendingPathComponent
是路径拼接,会在字符串前自动添加“/”,成为完整路径。FMDatabase *collectionDatabase = [FMDatabase databaseWithPath:fileName];
if ([collectionDatabase open]) {
}
1.具体文件路径
如果不存在会自动创建。
2.空字符串@""
会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被删除。
3.nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁。
BOOL result = [self.collectionDatabase executeUpdate:@"CREATE TABLE IF NOT EXISTS collectionData (mainLabel text NOT NULL, nameLabel text NOT NULL, imageURL text NOT NULL, networkURL text NOT NULL, dateLabel text NOT NULL, nowLocation text NOT NULL, goodState text NOT NULL, collectionState text NOT NULL, id text NOT NULL);"];
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败");
}
CREATE TABLE IF NOT EXISTS collectionData
:collectionData
的数据库,自己创建的话也可以改为自己方便识别的名字。mainLabel text NOT NULL
:collectionData
数据库里边添加了一个text
类型的名叫mainLabel
的一个索引,其它代码意思也相似。//1.获得数据库文件的路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"%@", doc);
NSString *fileName = [doc stringByAppendingPathComponent:@"collectionData.sqlite"];
//2.获得数据库
self.collectionDatabase = [FMDatabase databaseWithPath:fileName];
//3.打开数据库
if ([self.collectionDatabase open]) {
BOOL result = [self.collectionDatabase executeUpdate:@"CREATE TABLE IF NOT EXISTS collectionData (mainLabel text NOT NULL, nameLabel text NOT NULL, imageURL text NOT NULL, networkURL text NOT NULL, dateLabel text NOT NULL, nowLocation text NOT NULL, goodState text NOT NULL, collectionState text NOT NULL, id text NOT NULL);"];
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败");
}
}
self.collectionDatabase
都是之前定义的数据库类型的属性,对数据库的操作有些地方还是和C语言文件操作很相似的,比如打开数据库,关闭数据库的。execute
开头的方法返回的都是BOOL
类型的数据,用于判断你调用该方法是否操作成功,成功了就返回1,失败了就返回0。?
就相当于%@
也就是下面要输入内容。//插入数据
- (void)insertData {
if ([self.collectionDatabase open]) {
NSString *string = @"hi world";
BOOL result = [self.collectionDatabase executeUpdate:@"INSERT INTO collectionData (mainLabel, nameLabel, imageURL, networkURL, dateLabel, nowLocation, goodState, collectionState, id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);", string, string, string, string, string, string, string, string, string];
if (!result) {
NSLog(@"增加数据失败");
}else{
NSLog(@"增加数据成功");
}
[self.collectionDatabase close];
}
}
INSERT INTO collectionData
:collectionData
数据库中插入数据。后边的第一个括号就是你要赋值的索引,VALUES
之后就是你要赋的值,注意要和你想要赋值的索引还有索引数对应,同时也要就是和你当时定义的类型相同。// 更新数据
- (void)updateData {
if ([self.collectionDatabase open]) {
NSString *sql = @"UPDATE collectionData SET id = ? WHERE nameLabel = ?";
BOOL result = [self.collectionDatabase executeUpdate:sql, @"1", @"hi world"];
if (!result) {
NSLog(@"数据修改失败");
} else {
NSLog(@"数据修改成功");
}
[self.collectionDatabase close];
}
}
UPDATE collectionData SET id = ? WHERE nameLabel = ?
:collectionData
中的id
索引对应的数据,当WHERE
后的nameLabel = ?
条件成立的时候。// 删除数据
- (void)deleteData {
if ([self.collectionDatabase open]) {
NSString *sql = @"delete from collectionData WHERE collectionState = ?";
BOOL result = [self.collectionDatabase executeUpdate:sql, @"xixixixi"];
if (!result) {
NSLog(@"数据删除失败");
} else {
NSLog(@"数据删除成功");
}
[self.collectionDatabase close];
}
}
delete from collectionData WHERE collectionState = ?
:collectionData
数据库中的一组数据,当WHERE
之后的collectionState = ?
条件成立后。// 查询数据
- (void)queryData {
if ([self.collectionDatabase open]) {
// 1.执行查询语句
FMResultSet *resultSet = [self.collectionDatabase executeQuery:@"SELECT * FROM collectionData"];
// 2.遍历结果
while ([resultSet next]) {
NSString *mainLabel = [resultSet stringForColumn:@"mainLabel"];
NSLog(@"mainLabel = %@",mainLabel);
NSString *nameLabel = [resultSet stringForColumn:@"nameLabel"];
NSLog(@"nameLabel = %@",nameLabel);
NSString *imageURL = [resultSet stringForColumn:@"imageURL"];
NSLog(@"imageURL = %@",imageURL);
NSString *networkURL = [resultSet stringForColumn:@"networkURL"];
NSLog(@"networkURL = %@",networkURL);
NSString *dateLabel = [resultSet stringForColumn:@"dateLabel"];
NSLog(@"dateLabel = %@",dateLabel);
NSString *nowLocation = [resultSet stringForColumn:@"nowLocation"];
NSLog(@"nowLocation = %@",nowLocation);
NSString *goodState = [resultSet stringForColumn:@"goodState"];
NSLog(@"goodState = %@",goodState);
NSString *collectionState = [resultSet stringForColumn:@"collectionState"];
NSLog(@"collectionState = %@",collectionState);
NSString *id = [resultSet stringForColumn:@"id"];
NSLog(@"id = %@",id);
}
[self.collectionDatabase close];
}
}
SELECT * FROM collectionData
:collectionData
中的数据,*
处也可以改为WHERE
条件。以上就是我对FMDB的基础了解,如果以后了解到了更多我也会对博客进行相应的补充。