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