sqlite第三方类库FMDB的使用
? ? ? ?FMDB是ios平臺(tái)下解析sqlite的第三方數(shù)據(jù)庫(kù)管理框架,使用非常方便,而且提供了多線程安全的數(shù)據(jù)庫(kù)操作,相比coredata來(lái)說(shuō)更加靈活和輕量級(jí)。
? ? ? ? fmdb主要有三個(gè)類(lèi)別:
? ? ? ? fmdatabase:用來(lái)執(zhí)行sql語(yǔ)句;
? ? ? ?fmresultset:用來(lái)使用fmdatabase執(zhí)行查詢后的結(jié)果集合
? ? ? ?fmdatabasequeue:用來(lái)在多線程中查詢和更新數(shù)據(jù),它是線程安全的。
? ? ? ?需要注意的是,在iOS環(huán)境下,只有document directory 是可以進(jìn)行讀寫(xiě)的。
fmdb的使用
1.在新建的項(xiàng)目中,導(dǎo)入libsqlite3的動(dòng)態(tài)數(shù)據(jù)庫(kù):
注:(在Building Phases中的Link Binary WithLibraries中添加)
2.加入第三方框架fmdb中的這些主要文件:
3.在代碼中建立一個(gè)數(shù)據(jù)庫(kù),并指定文件路徑:
1 //指定沙盒路徑 2 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 3 //在指定沙盒路徑下添加sqlite文件 4 NSString *filepath = [path stringByAppendingPathComponent:@"moxue.sqlite"]; 5 //在指定path路徑下創(chuàng)建數(shù)據(jù)庫(kù) 6 FMDatabase *db = [FMDatabase databaseWithPath:filepath]; 7 //查看是否打開(kāi)成功 8 if (![db open]) { 9 return; 10 }else{ 11 NSLog(@"打開(kāi)成功"); 12 }4.在代碼中添加列表和列表屬性:(表格的參數(shù)不能是id(大小寫(xiě)都不可以),否則會(huì)出現(xiàn)創(chuàng)建表格失敗,因?yàn)楸砀裨趧?chuàng)建時(shí),表格會(huì)自動(dòng)生成一個(gè)id屬性)
注意:(表名不能是變量),否則會(huì)創(chuàng)建表格失敗或?yàn)榭?#xff0c;正確的寫(xiě)法為:
NSString *sql = [NSString stringWithFormat:@"select * from %@", tableName]; FMResultSet *rs = [db executeQuery:sql];?
5.在列表中插入數(shù)據(jù):
1 //插入數(shù)據(jù) 2 BOOL res = [db executeUpdate:@"INSERT INTO data (Title,date,Context,Url) VALUES(?,?,?,?)",@"墨雪",@"2015-10-11",@"我的表格",@"我的Url"]; 3 BOOL res1 = [db executeUpdate:@"INSERT INTO data (Title,date,Context,Url) VALUES(?,?,?,?)",@"劉慶",@"2015-10-10",@"劉慶的表格",@"劉慶的Url"]; 4 if (res1) { 5 NSLog(@"插入data成功"); 6 }else{ 7 NSLog(@"插入data表失敗"); 8 }6.在類(lèi)表中刪除數(shù)據(jù)或者列表:
1 BOOL dele = [db executeUpdate:@"DROP TABLE IF EXISTS data"]; 2 BOOL dele1 = [db executeUpdate:@"delete from data where Title = '墨雪'"]; 3 if (dele) { 4 NSLog(@"刪除數(shù)據(jù)成功"); 5 }else{ 6 NSLog(@"刪除數(shù)據(jù)失敗"); 7 }7.在列表中修改數(shù)據(jù):
1 //修改數(shù)據(jù) 2 BOOL UPDATE = [db executeUpdate:@"update data SET Title = '哈哈' WHERE id = 1" ]; 3 if (UPDATE) { 4 NSLog(@"修改成功"); 5 }else{ 6 NSLog(@"修改失敗"); 7 }8.在列表中查詢數(shù)據(jù):
1 //查詢數(shù)據(jù) 2 FMResultSet *RS = [db executeQuery:@"SELECT Title from data"]; 3 while ([RS next]) { 4 NSString *name = [RS stringForColumn:@"Title"]; 5 NSLog(@"%@",name); 6 }?9.?如果應(yīng)用中使用了多線程操作數(shù)據(jù)庫(kù),那么就需要使用FMDatabaseQueue來(lái)保證線程安全了。 應(yīng)用中不可在多個(gè)線程中共同使用一個(gè)FMDatabase對(duì)象操作數(shù)據(jù)庫(kù),這樣會(huì)引起數(shù)據(jù)庫(kù)數(shù)據(jù)混亂。 為了多線程操作數(shù)據(jù)庫(kù)安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很簡(jiǎn)單,首先用一個(gè)數(shù)據(jù)庫(kù)文件地址來(lái)初使化FMDatabaseQueue,然后就可以將一個(gè)閉包(block)傳入inDatabase方法中。 在閉包中操作數(shù)據(jù)庫(kù),而不直接參與FMDatabase的管理。
1 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filepath]; 2 dispatch_queue_t myq1 = dispatch_queue_create("myqueue1", nil); 3 dispatch_async(myq1, ^{ 4 [queue inDatabase:^(FMDatabase *db) { 5 FMResultSet *RS = [db executeQuery:@"SELECT Title from data"];//NSString *address = [db stringForQuery:@"SELECT Address FROM PersonList WHERE Name = ?",@"John”]; 6 while ([RS next]) { 7 NSString *name = [RS stringForColumn:@"Title"]; 8 NSLog(@"%@",name); 9 } 10 11 }]; 12 });
10.關(guān)閉數(shù)據(jù)庫(kù)
?1 [db close]; ?
11.另外?FMResultSet 還提供了很多方法來(lái)獲得所需的格式的值:
intForColumn: longForColumn: longLongIntForColumn: boolForColumn: doubleForColumn: stringForColumn: dataForColumn: dataNoCopyForColumn: UTF8StringForColumnIndex: objectForColumn: 12.fmda在存儲(chǔ)的過(guò)程中,傳給execute方法的參數(shù)必須是NSObject,如果是int,float等需要先將數(shù)據(jù)進(jìn)行包裝,否則傳過(guò)去的數(shù)據(jù)要么為null要么導(dǎo)致程序crash。正確的寫(xiě)法應(yīng)該是:FMResultSet *rs = [db executeQuery:sql, [NSNumber numberWithLong:mynum];
?
轉(zhuǎn)載于:https://www.cnblogs.com/moxuexiaotong/p/4870438.html
總結(jié)
以上是生活随笔為你收集整理的sqlite第三方类库FMDB的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET跨平台之旅:将示例站点从ASP.
- 下一篇: spring事务的传播特性