SQLite(http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。iOS SDK 很早就支持了 SQLite,在使用时,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。但是,原生的 SQLite API 在使用上相当不友好,在使用时,非常不便。于是,开源社区中就出现了一系列将 SQLite API 进行封装的库,而 FMDB (https://github.com/ccgus/fmdb) 则是开源社区中的优秀者。
在FMDB中主要与三个类
FMDatabase:代表一个SQLite数据库用于执行SQL语句。
FMResultSet:FMDatabase里的查询结构。
FMDatabaseQueue:多线程下查询和更新数据库会使用。这个类线程安全。
在操作一个数据库之前,我们需要先有一个数据库。
/**
* 新建一个数据库
*/
- (void)initDataBase{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"Student1.db"];
NSLog(@"dbPath = %@",dbPath);
self.dataBase = [FMDatabase databaseWithPath:dbPath];
}
在一个数据库中可以有多张表,所以我们还需要在这个数据库文件中新建一张Student表。
/**
* 数据库中新建一个表
*/
- (void)creatTabel{
[self.dataBase open];
[self.dataBase executeUpdate:@"CREATE TABLE IF NOT EXISTS Student (rowid INTEGER PRIMARY KEY AUTOINCREMENT, name text,age text,address text)"];
[self.dataBase close];
}
在这个里面有个:
rowid INTEGER PRIMARY KEY AUTOINCREMENT
为什么有加这一句话呢?请移步这里。其实我们也可以自己尝试,看看加和不加后会有什么不同。
表也有了,下面就是实际应用了。
/**
* 以学生模型插入数据库
*
* @param student 学生数据模型
*/
- (void)insterStudent:(Student *)student{
[self.dataBase open];
[self.dataBase executeUpdate:@"INSERT INTO Student (name,age,address) VALUES (?,?,?)",student.name,student.age,student.address];
[self.dataBase close];
}
在里有个学生的类,学生的类里面有三个属性和一个类方法:
/**
* 姓名
*/
@property (nonatomic,copy)NSString *name;
/**
* 年龄
*/
@property (nonatomic,copy)NSString *age;
/**
* 地址
*/
@property (nonatomic,copy)NSString *address;
+ (Student *)creatStudent:(NSString *)name age:(NSString *)age address:(NSString *)address;
+ (Student *)creatStudent:(NSString *)name age:(NSString *)age address:(NSString *)address{
Student *model = [[Student alloc] init];
model.name = name;
model.age = age;
model.address = address;
return model;
}
其实也是为了操作起来方便而建的这个类。
/**
* 删除数据库里面 一类名字的学生数据
*
* @param student 学生模型
*/
- (void)deleteStudent:(Student *)student{
[self.dataBase open];
[self.dataBase executeUpdate:@"DELETE FROM Student WHERE name = ?",student.name];
[self.dataBase close];
}
/**
* 更新一个学生的数据
*
* @param student 学生数据模型
*/
- (void)updateStudent:(Student *)student{
[self.dataBase open];
[self.dataBase executeUpdate:@"UPDATE Student SET age= ? WHERE name = ?",student.age, student.name];
[self.dataBase close];
}
这里写了两个方法
/**
* 获取表中的所有数据 以学生模型的形式存储在数组中
*
* @return 表中的数据
*/
- (NSMutableArray *)getAllStudent{
[self.dataBase open];
FMResultSet *result = [self.dataBase executeQuery:@"SELECT * FROM Student"];
NSMutableArray *stuArray = [[NSMutableArray alloc] init];
while ([result next]) {
Student *model = [Student creatStudent:[result stringForColumn:@"name"] age:[result stringForColumn:@"age"] address:[result stringForColumn:@"address"]];
[stuArray addObject:model];
}
[self.dataBase close];
return stuArray;
}
/**
* 根据姓名 查找学生
*
* @param name name
*
* @return 名字为name的学生数组
*/
- (NSMutableArray *)getStudents:(NSString *)name{
[self.dataBase open];
FMResultSet *result = [self.dataBase executeQuery:@"SELECT * FROM Student WHERE name = ?",name];
NSMutableArray *stuArray = [[NSMutableArray alloc] init];
while ([result next]) {
Student *model = [Student creatStudent:[result stringForColumn:@"name"] age:[result stringForColumn:@"age"] address:[result stringForColumn:@"address"]];
[stuArray addObject:model];
}
[self.dataBase close];
return stuArray;
}
查询是操作的重点,主要有这些方式:
<1>查询表格中所有数据
SELECT * FROM myStudentInfo
<2>查询指定的字段
实例: 查询所有名字name
SELECT name FROMmyStudentInfo
<3>根据指定的条件进行查询
实例: 查找name为zhansan的所有信息
SELECT * FROM myStudentInfo WHEREname = 'zhangsan'
<4>根据多个条件进行查询
实例: 查找name为zhansan, 并且性别为boy的所有信息
SELECT * FROM myStudentInfo WHEREname = 'zhangsan' AND sex = 'boy'
<5>查询后需要排序
//根据age升序排列
SELECT * FROMmyStudentInfo ORDER BYage;
//根据age降序排列
SELECT * FROMmyStudentInfo ORDER BYage DESC;
<6>获取数据行数
SELECT count(*)FROM myStudentInfo
在具体位置使用。这个demo的做法是使用5个按钮来操作这5个方法。
/**
* 随机生成一个学生数据模型
*
* @return 学生数据模型
*/
- (Student *)getStudent{
Student *student = [Student creatStudent:self.nameArray[arc4random()%6] age:[NSString stringWithFormat:@"%u",arc4random()%100] address:[NSString stringWithFormat:@"%u",arc4random()%1000]];
return student;
}
/**
* 插入数据进数据库
*
* @param sender sender description
*/
- (IBAction)addBtn:(UIButton *)sender {
Student *stu = [self getStudent];
[self insterStudent:stu];
}
/**
* 删除一个学生数据 name = 一
*
* @param sender sender description
*/
- (IBAction)delebtn:(UIButton *)sender {
[self deleteStudent:[Student creatStudent:@"一" age:nil address:nil]];
}
/**
* 修改学生数据 name = 二
*
* @param sender sender description
*/
- (IBAction)modifyBtn:(UIButton *)sender {
[self updateStudent:[Student creatStudent:@"二" age:@"1" address:@"0"]];
}
/**
* 获取所有表中的数据
*
* @param sender sender description
*/
- (IBAction)searchBtn:(UIButton *)sender{
NSMutableArray *temp = (NSMutableArray *)[self getAllStudent];
[temp enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
Student *student = (Student *)obj;
NSLog(@"查找全部: name = %@ age = %@",student.name,student.age);
}];
}
/**
* 查询 name = 三 的学生
*
* @param sender sender description
*/
- (IBAction)searBtn:(UIButton *)sender {
NSMutableArray *temp = (NSMutableArray *)[self getStudents:@"三"];
[temp enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
Student *student = (Student *)obj;
NSLog(@"查找姓三的: name = %@ age = %@",student.name,student.age);
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.nameArray = @[@"一",@"二",@"三",@"四",@"五",@"六"];
[self initDataBase];
[self creatTabel];
// Do any additional setup after loading the view, typically from a nib.
}
2015-10-23 17:19:31.429 FMDB[3273:131837] dbPath = /Users/xxxx/Library/Developer/CoreSimulator/Devices/B18BEA3B-03D9-45D1-A892-3E7E182DC345/data/Containers/Data/Application/52BC6009-A68A-450E-8692-1C49C5722781/Documents/Student1.db
2015-10-23 17:19:36.322 FMDB[3273:131837] 查找姓三的: name = 三 age = 28
2015-10-23 17:19:36.322 FMDB[3273:131837] 查找姓三的: name = 三 age = 17
2015-10-23 17:19:36.322 FMDB[3273:131837] 查找姓三的: name = 三 age = 94
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 六 age = 97
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 五 age = 71
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 三 age = 28
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 二 age = 1
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 三 age = 17
2015-10-23 17:19:37.594 FMDB[3273:131837] 查找全部: name = 五 age = 51
2015-10-23 17:19:37.595 FMDB[3273:131837] 查找全部: name = 三 age = 94