iOS数据库开发之SQLite和FMDB详解(附Demo)
2016-10-12 14:25
507 查看
一.SQLite简介
先莫急,认真看完简介,一定对你有帮助的(已经熟知的跳过简介,当你在公司有同事不会sqlite的时候,你就可以先简单的说几句SQLite的简介以达到装逼的目的,装b效果如果100分的话,大多基本上会给你90分了)。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。
二.sqlite使用之创建数据库,创建表,对表内数据操作等
1.创建数据库(前面的准备工作(导入libsqlite3库)就不介绍了)
2.创建表
3.插入数据
execSql方法
就不贴修改、删除数据的代码了,附件demo里有详细代码。
只要sql不是SELECT命令的都视为更新操作(使用exec开头的方法)。就包括《CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE》等等。SELECT命令的话,使用sqlite3_prepare开头的方法。
4.查询数据
三.FMDB的用法
由于原生的SQLite在进行数据操作的时候,使用的是C语言中的函数,对于我这种C语言又是小白的人,就会感觉比较麻烦。程序员都是懒人,于是,出了一系列的对SQLite的API进行封装的库,如FMDB。还有一些其他的,就不列举了,自行百度。
1.FMDB简介
https://github.com/ccgus/fmdb‘>FMDB是针对iOS的libsqlite3框架的封装的一个简易库(简单易学,轻量级,使用灵活),它用起来和SQLite类似,而且,对多线程并发操作进行了处理,所以线程安全。
2.比较重要的几个类
FMDB.h 引入了你在使用FMDB过程中可能会用到的几个类。
FMDatabase 代表一个单独的SQLite数据库,用它调用方法执行sql语句,类似原生sqlite3。
FMResultSet 在使用FMDatabase执行了查询的sql语句后,得到的结果集,就是FMResultSet。
FMDatabaseQueue 多线程中,执行数据操作,查询等。
3.使用FMDB创建数据库和表(首先实现文件里声明全局变量fmdb)
同样的道理,只有是操作数据的命令,都是调用executeUpdate方法,查询命令SELECT则调用executeQuery开头的方法。这里就不列举增删改的方法了。
4.fmdb查询数据
5.fmdb多线程
6.查询结果获取数据格式的方法,在FMResultSet.h文件里面,搜索包含ForColumn的方法定义。然后,你就会发现类似这种doubleForColumn、doubleForColumnIndex的方法,注释也是写的非常的详细,不懂英语其实翻译一下就搞定,机智如我。
四.工具推荐
喜欢用客户端的自行百度搜索SQLiteManager for mac 破解版,毕竟找工具还是自力更生。我不喜欢客户端,有没有简单粗暴的直接可以打开的?有!如果你有装火狐浏览器、就应该会用插件。不会的也可以下一个火狐浏览器,开发用还是很ok的。
点击跳转源码下载地址
先莫急,认真看完简介,一定对你有帮助的(已经熟知的跳过简介,当你在公司有同事不会sqlite的时候,你就可以先简单的说几句SQLite的简介以达到装逼的目的,装b效果如果100分的话,大多基本上会给你90分了)。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。
二.sqlite使用之创建数据库,创建表,对表内数据操作等
1.创建数据库(前面的准备工作(导入libsqlite3库)就不介绍了)
- (void)createDataBase{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsStr = [paths objectAtIndex:0]; //应用的文档目录 NSLog(@"%@",documentsStr); NSString *database_path = [documentsStr stringByAppendingPathComponent:KDBName]; //打开数据库,如果没有的话,就会在该目录创建该数据库。 if(sqlite3_open([database_path UTF8String], &db) != SQLITE_OK) { sqlite3_close(db); } }
2.创建表
- (void)createTable{ //IF NOT EXISTS 如果不存在 (如果该数据库已经存在了该表,则sqlite3_exec在执行数据库操作的时候不会报错给我们,如果表已经存在了,又没有加这个判断的话,会执行不成功并关闭数据库) NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (ID INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, sex INTEGER, phoneNum VARCHAR);",KTBUserInfo]; [self execSql:sql]; /* * sqlite数据库里面的数据类型参考SQLite数据库的文档,这里的sql语句CREATE、INTEGER等关键词,大写是为了区分这是系统的,并不是规定的,小写也是能正常通过的,不过,为了规范,建议大写。 */ }
3.插入数据
- (void)insertData{ NSString *sql = [NSString stringWithFormat: @"INSERT INTO '%@' ('name', 'age', 'sex', 'phoneNum') VALUES ('%@', '%@', '%@','%@');",KTBUserInfo, @"张三", @"23", @"1",@"18875022022"]; [self execSql:sql]; sql = [NSString stringWithFormat: @"INSERT INTO '%@' ('name', 'age', 'sex', 'phoneNum') VALUES ('%@', '%@', '%@','%@');",KTBUserInfo, @"李四", @"24", @"0",@"18875022023"]; [self execSql:sql]; sql = [NSString stringWithFormat: @"INSERT INTO '%@' ('name', 'age', 'sex', 'phoneNum') VALUES ('%@', '%@', '%@','%@');",KTBUserInfo, @"王五", @"25", @"1",@"18875022024"]; [self execSql:sql]; }
execSql方法
- (void)execSql:(NSString *)sql{ char *err; sqlite3_open([[documents stringByAppendingPathComponent:KDBName] UTF8String], &db); sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err); sqlite3_close(db); }
就不贴修改、删除数据的代码了,附件demo里有详细代码。
只要sql不是SELECT命令的都视为更新操作(使用exec开头的方法)。就包括《CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE》等等。SELECT命令的话,使用sqlite3_prepare开头的方法。
4.查询数据
- (void)queryDataWithTableName:(NSString *)tbName{ sqlite3_open([[documents stringByAppendingPathComponent:KDBName] UTF8String], &db); NSString *sqlQuery = [NSString stringWithFormat:@"SELECT * FROM %@;",tbName]; sqlite3_stmt *statement; if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { char *name = (char*)sqlite3_column_text(statement, 1); NSString *nsNameStr = [[NSString alloc] initWithUTF8String:name]; int age = sqlite3_column_int(statement, 2); int sex = sqlite3_column_int(statement, 3); int columnCount = sqlite3_column_count(statement); if (columnCount == 5) {//为了兼容我这里两个表,其中一个表少一个字段,拣个懒 char *phoneNum = (char*)sqlite3_column_text(statement, 4); NSString *phoneNumStr = [[NSString alloc] initWithUTF8String:phoneNum]; NSLog(@"%@: name:%@ age:%d sex:%d phoneNum:%@",tbName,nsNameStr,age,sex,phoneNumStr); }else{ NSLog(@"%@: name:%@ age:%d sex:%d",tbName,nsNameStr,age,sex); } } }else{ NSLog(@"%@查询数据失败",tbName); } sqlite3_close(db); }
三.FMDB的用法
由于原生的SQLite在进行数据操作的时候,使用的是C语言中的函数,对于我这种C语言又是小白的人,就会感觉比较麻烦。程序员都是懒人,于是,出了一系列的对SQLite的API进行封装的库,如FMDB。还有一些其他的,就不列举了,自行百度。
1.FMDB简介
https://github.com/ccgus/fmdb‘>FMDB是针对iOS的libsqlite3框架的封装的一个简易库(简单易学,轻量级,使用灵活),它用起来和SQLite类似,而且,对多线程并发操作进行了处理,所以线程安全。
2.比较重要的几个类
FMDB.h 引入了你在使用FMDB过程中可能会用到的几个类。
FMDatabase 代表一个单独的SQLite数据库,用它调用方法执行sql语句,类似原生sqlite3。
FMResultSet 在使用FMDatabase执行了查询的sql语句后,得到的结果集,就是FMResultSet。
FMDatabaseQueue 多线程中,执行数据操作,查询等。
3.使用FMDB创建数据库和表(首先实现文件里声明全局变量fmdb)
@interface ViewController (){ sqlite3 *db; FMDatabase *fmdb;//!< FMDatabase,执行数据操作,查询。 } @end @implementation ViewController #pragma amrk - fmdb创建数据库 - (void)fmdbCreate{ NSString *database_path = [documents stringByAppendingPathComponent:KFMDBName]; //数据库打开、创建 fmdb = [FMDatabase databaseWithPath:database_path]; } #pragma amrk - fmdb创建表 - (void)fmdbTableCreate{ NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (ID INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, sex INTEGER, phoneNum VARCHAR);",KTBUserInfo]; [self fmdbExecSql:sql]; } #pragma mark - fmdbUpdate - (void)fmdbExecSql:(NSString *)sql{ if ([fmdb open]) { /* * 只要sql不是SELECT命令的都视为更新操作(使用executeUpdate方法)。就包括 CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE等等。SELECT命令的话,使用executeQuery方法。 * 执行更新返回一个BOOL值。YES表示 执行成功,否则表示有错误。你可以调用 -lastErrorMessage 和 -lastErrorCode方法来得到更多信息。 */ if ([fmdb executeUpdate:sql]) { NSLog(@"%@%@%@",@"fmdb操作表",KTBUserInfo,@"成功!"); }else{ NSLog(@"%@%@%@ lastErrorMessage:%@,lastErrorCode:%d",@"fmdb创建",KTBUserInfo,@"失败!",fmdb.lastErrorMessage,fmdb.lastErrorCode); } }else{ NSLog(@"%@",@"fmdb数据库打开失败!"); } } @end
同样的道理,只有是操作数据的命令,都是调用executeUpdate方法,查询命令SELECT则调用executeQuery开头的方法。这里就不列举增删改的方法了。
4.fmdb查询数据
- (void)fmdbSelectData{ NSString *sqlQuery = [NSString stringWithFormat:@"SELECT * FROM %@;",KTBUserInfo]; //根据条件查询,如果成功返回FMResultSet对象,错误返回nil。与执行更新相当,支持使用NSError参数。 FMResultSet *resultSet = [fmdb executeQuery:sqlQuery]; //遍历结果集合 while ([resultSet next]){ NSString *name = [resultSet objectForColumnName:@"name"]; int age = [resultSet intForColumn:@"age"]; int sex = [resultSet intForColumn:@"sex"]; NSString *phone = [resultSet objectForColumnName:@"phoneNum"]; NSLog(@"%@: name:%@ age:%d sex:%d phoneNum:%@",KTBUserInfo,name,age,sex,phone); } /* * fmdb封装过后的读取数据是要比原生的sqlite3方便了很多哈 */ }
5.fmdb多线程
- (void)fmdbQueue{ //创建队列 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[documents stringByAppendingPathComponent:KFMDBName]]; __block BOOL tag = true; //把任务放到到队列里 [queue inTransaction:^(FMDatabase *dbe, BOOL *rollback) { tag &= [dbe executeUpdate:@"INSERT INTO userInfo ('age') VALUES (?)",[NSNumber numberWithInt:11]]; tag &= [dbe executeUpdate:@"INSERT INTO userInfo ('age') VALUES (?)",[NSNumber numberWithInt:22]]; tag &= [dbe executeUpdate:@"INSERT INTO userInfo ('age') VALUES (?)",[NSNumber numberWithInt:33]]; //如果有错误 回滚 if (!tag){ *rollback = YES; return; } }]; }
6.查询结果获取数据格式的方法,在FMResultSet.h文件里面,搜索包含ForColumn的方法定义。然后,你就会发现类似这种doubleForColumn、doubleForColumnIndex的方法,注释也是写的非常的详细,不懂英语其实翻译一下就搞定,机智如我。
四.工具推荐
喜欢用客户端的自行百度搜索SQLiteManager for mac 破解版,毕竟找工具还是自力更生。我不喜欢客户端,有没有简单粗暴的直接可以打开的?有!如果你有装火狐浏览器、就应该会用插件。不会的也可以下一个火狐浏览器,开发用还是很ok的。
点击跳转源码下载地址
相关文章推荐
- Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录
- iOS 数据储存--SQLite 操作数据库-FMDB,sqlite数据类型,保存图片,demo
- iOS 开发 数据库详解之FMDB
- Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录
- iOS开发 - 第06篇 - 实用技术 - 02 - 数据库SQLite & FMDB
- Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录
- IOS开发-封装数据库sqlite3之为何选择FMDB
- IOS-20-数据库操作之(SQLite第三方封装库FMDB)的基础入门使用及demo源码
- Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- IOS 数据库操作SQLite3使用详解
- iOS开发之Sqlite 第三方库FMDB的使用
- ios sqlite 第三方FMDB框架操作数据库
- [置顶] Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【转】IOS数据库操作SQLite3使用详解
- iOS开发-数据库-sqlite操作1
- Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作
- IOS数据库操作SQLite3使用详解
- [iOS开发高效第三方库之]sqlite3封装库---FMDB