前言:
上回我们解决了遇到的第一个问题,心里有点小窃喜。但是,别高兴的太早,未来还有更多的问题等待着我们呢。一起努力吧!
此时,我们开始使用FMDB来管理数据库。
首先,为大家推荐一款可视化sqlite数据库管理工具:SQLite Manager,我认为挺好用的,毕竟我们只是测试用,只要能够看见数据的增删就OK了。
注:mac终端有一个专门的sqlite3数据库,进入终端->sqlite3 test.db,直接进入,但是对我而言,不太好用,不直观,个人观点。
![](https://img.haomeiwen.com/i3221754/ac51e915bd79e37f.png)
1.用上面的工具先创建一个简单的数据库
![](https://img.haomeiwen.com/i3221754/7e2e0a383f936b8e.png)
![](https://img.haomeiwen.com/i3221754/8623d371beb84dd4.png)
2.将数据库和我们的应用连接起来,将数据库导入工程里面
在工程里面获取该数据库的时候,我们会使用如下代码:
//获取工程里面的数据库路径
NSString *studentDBPath = [[NSBundle mainBundle] pathForResource:@"studentSqlite" ofType:@"db"];
但是,有时你会发现根本找不到下面的文件,获取的 studentDBPath 为空。明明工程里面有数据库文件,代码却找不到,很是奇怪???
解决的办法是:
![](https://img.haomeiwen.com/i3221754/1ff65e145b5f0ed8.png)
照上图,在Build Phases里面,使用上面的方法找到的所有文件只能是在Copy Bundle Resources里面包含的文件,否则,查找不到。
CopyBundle Resources 主要是一些资源文件会被打包的时候会被放入app中
3. 替换数据库
3.1 创建空数据库
刚刚导入的数据库只是在工程里面,我们编译运行后,手机软件里面的文件并没有导入的数据库,所以需要先创建一个空的数据库到软件Document
//获取文档路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//创建一个空文件(数据库)
NSString *fileName = [path stringByAppendingPathComponent:@"test.db"]
上面创建了一个空的数据库,如果接下来我们就直接打开数据
//创建数据库实例
FMDatabase *database = [[FMDatabase alloc]initWithPath:fileName];
if ([database open]) {
NSLog(@"打开数据库成功");
}
你会看到下面的错误消息,提示你没有找到某某表, table不存在
2016-12-30 21:58:47.460 1_数据库fmdb简单测试[839:53506] 打开数据库成功
2016-12-30 21:58:47.462 1_数据库fmdb简单测试[839:53506] DB Error: 1 "no such table: student"
2016-12-30 21:58:47.462 1_数据库fmdb简单测试[839:53506] DB Query: select * from student;
想着也是,我们创建的是空数据库,还没有创建表,所以会报这个错误
3.2 替换空数据库
上面我们已经在软件内部(NSDocumentDirectory)创建了一个新的空数据库,然后把我们工程里面的数据库替换掉这个空数据库
//1.先在Document里面查找看有没有对应的数据库,有的话就不用替换了
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [searchPaths objectAtIndex:0];
NSString *dbPath = [docPath stringByAppendingPathComponent:@"studentDB.db"];
NSLog(@"%@",dbPath);
//2.使用NSFileManager才能直接管理应用里面的文件,进行替换或者删除
NSFileManager *fileManager = [[NSFileManager alloc]init];
BOOL isExit = [fileManager fileExistsAtPath:dbPath];
//如果不存在,将工程里面数据库的复制到Document里面
if (!isExit) {
NSLog(@"原来不存在数据库");s
//获取工程里面的数据库路径,如果获取不到路径,往上翻翻,有解决办法
NSString *studentDBPath = [[NSBundle mainBundle] pathForResource:@"studentSqlite" ofType:@"db"];
NSLog(@"%@",studentDBPath);
//替换数据库
BOOL success = [fileManager copyItemAtPath:studentDBPath toPath:dbPath error:nil];
if (success) {
NSLog(@"数据库替换成功");
}
到目前为止,存在应用里面的就是我们自己创建的有数据的数据库了。
4.FMDB数据库查询、增加、删除
4.0 打开数据库
//1.获得数据库文件的路径
FMDatabase *database = [[FMDatabase alloc]initWithPath:dbPath];
if ([database open]) {
NSLog(@"打开数据库成功");
}
4.1 查询
//使用SQL语句,从表中获取一个集合
FMResultSet *resultSet = [database executeQuery:@"select * from student;"];
//[resultSet next],会一条一条的遍历,直到为空值结束循环
while ([resultSet next]) {
Student *stu = [[Student alloc]init];
stu.number = [resultSet intForColumn:@"number"];
stu.name = [resultSet objectForColumnName:@"name"];
stu.age = [resultSet intForColumn:@"age"];
sssss
/**一开始,数组students没有数据,而且也添加不进去数据,是因为:没有初始化,即没有内存空间放数据*/
[self.students addObject:stu];
}
4.2 增加
对于增加,我是直接设置一个按钮,点击一下就往数据库里面填写一条数据,使用SQLite Manager,可以方便看到增加进了数据库,主动调用SQLiteManager,非常方便
数据库除了查询,其他都是更新
#pragma mark - 添加数据
- (IBAction)updateData:(id)sender {
NSString *name = @"新添加的";sw
NSInteger age = arc4random();
BOOL success = [database executeUpdate:@"insert into student (name,age) values(?,?)",name,@(age)];
if (!success) {
NSLog(@"%@",[database lastErrorMessage]);
}
}
4.3 删除数据
#pragma mark - 删除数据
- (IBAction)deleteData:(id)sender {
//delete from student where number = 1 ,这是SQL语句,有空的朋友可以去了解SQL语句
NSString *deleteData = [NSString stringWithFormat:@"delete from student where number = 1 "];
//开始一直没有删除成功, 原因是 把数据库的 名字写成了表的名字了
BOOL success = [self.db executeUpdate:deleteData];
if (success) {
NSLog(@"删除成功");
}
}
5. 总结
到此为止,一般简单的FMDB操作都已经写完了,还有多线程操作,目前还没有学习到,到学习了以后再次添加,还要抽个时间大概了解一下SQL语言。
由于这是第一次在简书上写文章,有什么不妥的地方,欢迎评论,一起探讨交流。
2017年到了,祝大家元旦快乐。。。
github示例库:https://github.com/Brucelin2015/FMDBSimpleOperation
网友评论