@sqlite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是AndroID还是IOS,都内置了sqlite数据库,现在的版本都是sqlite3。在IOS中使用sqlite如果使用SDK提供的方法,特别麻烦也不利于理解和使用,感觉使用很不方便,今天就讲讲一个针对IOS的sqlite API封装的第三方库FMDB,FMDB对SDK中的API做了一层封装,使之使用OC来访问,使用方便而且更熟悉。FMDB的下载地址https://github.com/ccgus/fmdb。
@FMDB主要涉及两个类,FMDatabase和FMResultSet下载完FMDB源码后把文件拖到工程中,并导入sqlite支持 库,libsqlite3.0.dylib
#import "HMTDataBaseHandle.h"#import "FMDB.h"#import "HMTPerson.h"@implementation HMTDataBaseHandlestatic HMTDataBaseHandle * _dbHandle = nil;+ (HMTDataBaseHandle *)shareInstance{ @synchronized(self){ if (!_dbHandle) { _dbHandle = [[HMTDataBaseHandle alloc]init]; [_dbHandle openDataBase]; [_dbHandle createtable]; } } return _dbHandle;}#pragma mark - 定义一个 FMDatabase 对象static FMDatabase * database = nil;#pragma mark - 获得沙盒文件下documents路径- (Nsstring *)getdocumentsPath{ Nsstring * documents = [NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES) lastObject]; return documents;}#pragma mark - 打开数据库 *** 作------ databaseWithPath open- (voID)openDataBase{ if (database) { return; } Nsstring * DataBasePath = [[self getdocumentsPath] stringByAppendingPathComponent:@"test.sqlite"]; database = [FMDatabase databaseWithPath:DataBasePath]; if (![database open]) { NSLog(@"打开数据库失败"); } // 为数据库设置缓存,提高查询效率 database.shouldCacheStatements = YES; NSLog(@"打开数据库成功");}#pragma mark - 关闭数据库 *** 作- (voID)closeDataBase{ if (![database close]) { NSLog(@"关闭数据库失败"); return; } database = nil; NSLog(@"关闭数据库成功");}#pragma mark - 管理创建表的 *** 作- (voID)createtable{ [self openDataBase]; // 判断表是否存在,不存在就创建------ tableExists if (![database tableExists:@"Person"]) { [database executeUpdate:@"CREATE table Person(ID INTEGER PRIMARY KEY autoINCREMENT,name TEXT,age INTEGER)"]; NSLog(@"创建表成功"); } [self closeDataBase];}#pragma mark - 增加数据 *** 作----- executeUpdate- (voID)insertIntoDataBase:(HMTPerson *)person{ [self openDataBase]; [database executeUpdate:@" INSERT INTO Person (ID,name,age) VALUES (?,?,?)",[Nsstring stringWithFormat:@"%i",person.personID],person.personname,person.personAge]]; [self closeDataBase];}#pragma mark - 删除数据 *** 作----- executeUpdate- (voID)deleteDataFromDataBase:(HMTPerson *)person{ [self openDataBase]; [database executeUpdate:@" DELETE FROM Person WHERE ID = ?",person.personID]]; [self closeDataBase];}#pragma mark - 更新数据 *** 作----- executeUpdate- (voID)updateFromDataBase:(HMTPerson *)person{ [self openDataBase]; [database executeUpdate:@" UPDATE Person SET name = ? WHERE ID = ?",person.personID]]; [self closeDataBase];}#pragma mark - 查询数据 *** 作(与其他的都不一样,查询是调用executequery,切记切记!!!!!!)- (voID)selectAllDataFromDataBase{ [self openDataBase]; FMResultSet * resultSet = [database executequery:@" SELECT * FROM Person"]; while ([resultSet next]) { int ID = [resultSet intForColumn:@"ID"]; Nsstring * name = [resultSet stringForColumn:@"name"]; int age = [resultSet intForColumn:@"age"]; NSLog(@"personID:%i,personname:%@,personAge:%i",ID,age); } [self closeDataBase];}@end
@FMDB提供如下多个方法来获取不同类型的数据:
1.intForColumn:
2.longForColumn:
3.longLongIntForColumn:
4.boolForColumn:
5.doubleForColumn:
6.stringForColumn:
7.dateForColumn:
8.dataForColumn:
9.datanocopyForColumn:
10.UTF8StringForColumnIndex:
11.objectForColumn:
@如果我们的app需要多线程 *** 作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。切记不能在多个线程中共同一个FMDatabase对象并且在多个线程中同时使用,这个类本身不是线程安全的,这样使用会造成数据混乱等问题。
使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。在闭包中 *** 作数据库,而不直接参与FMDatabase的管理。
[cpp] view plain copy -(voID)executeDBOperation { //获取document文件夹下的数据库文件,没有则创建 Nsstring*docPath=[NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,YES)objectAtIndex:0]; Nsstring*dbPath=[docPathstringByAppendingPathComponent:@"user.db"]; FMDatabaseQueue*databaseQueue=[FMDatabaseQueuedatabaseQueueWithPath:dbPath]; [databaseQueueinDatabase:^(FMDatabase*db){ [dbexecuteUpdate:@"insertintouservalues(?,?)",@"Ren",@"Male",[NSNumbernumberWithInt:20]]; }]; [databaseQueueclose]; } 总结
以上是内存溢出为你收集整理的数据持久化(三)使用第三方类库FMDB全部内容,希望文章能够帮你解决数据持久化(三)使用第三方类库FMDB所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)