OS中原生的SQLite API在使用上大部分都是C语言代码,在使用时,非常不便,因此便出现了很多针对SQLite封装的第三方框架,其中FMDB就是其中一个优秀的框架,FMDB以OC的方式封装了SQLite的C语言API, 它的出现使操作SQLite变得更简洁易用,相比苹果自带的Core Data框架,FMDB显得更加轻量级,灵活。
FMDB的下载地址: https://github.com/ccgus/fmdb
在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包
FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。
FMResultSet :执行查询一个FMDatabase结果集。
FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类
NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; path=[path stringByAppendingPathComponent:@"test.sqlite"]; dataBase=[FMDatabase databaseWithPath:path];
BOOL open=[dataBase open]; if(open){ NSLog(@"数据库打开成功"); }
NSString * create1=@"create table if not exists t_user(id integer autoincrement primary key,name varchar)"; BOOL c1= [dataBase executeUpdate:create1]; if(c1){ NSLog(@"创建表成功"); }
NSString * insertSql=@"insert into t_user(id,name) values(?,?)"; // 插入语句1 bool inflag1=[dataBase executeUpdate:insertSql,@(2),@"admin"]; // 插入语句2 bool inflag2=[dataBase executeUpdate:insertSql withArgumentsInArray:@[@"admin",@(5)]]; // 插入语句3 bool inflag3=[dataBase executeUpdateWithFormat:@"insert into t_user(id,name) values(%@,%d)",@"admin",6]; // 删除语句 NSString * delete=@"delete from t_user"; BOOL dflag= [dataBase executeUpdate:delete]; if(dflag){ NSLog(@"删除成功"); } // 修改语句 NSString *update=@" update t_user set name=? "; BOOL flag= [dataBase executeUpdate:update,@"zhangsan"]; if(flag){ NSLog(@"修改成功"); }
NSString * sql=@" select * from t_user "; FMResultSet *result=[dataBase executeQuery:sql]; while(result.next){ int ids=[result intForColumn:@"id"]; NSString * name=[result stringForColumn:@"name"]; int ids=[result intForColumnIndex:0]; NSString * name=[result stringForColumnIndex:1]; NSLog(@"%@,%d",name,ids); }
如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理
NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; path=[path stringByAppendingPathComponent:@"test.sqlite"]; FMDatabaseQueue * queue=[FMDatabaseQueue databaseQueueWithPath:path]; [queue inDatabase:^(FMDatabase *db) { NSString * create=@"create table if not exists t_book(id integer,name varchar)"; BOOL c1= [db executeUpdate:create]; if(c1){ NSLog(@"成功"); } }]; [queue inDatabase:^(FMDatabase *db) { NSString * insertSql=@"insert into t_book(id,name) values(?,?)"; //插入语句1 bool inflag=[db executeUpdate:insertSql,@(2),@"admin"]; if(inflag){ NSLog(@"插入成功"); } }]; [queue inDatabase:^(FMDatabase *db) { FMResultSet * data=[db executeQuery:@" select * from t_book "]; while (data.next) { int ids=[data intForColumn:@"id"]; NSString *name=[data stringForColumn:@"name"]; NSLog(@"%@",name); NSLog(@"%i",ids); } }];