SlideShare a Scribd company logo
1 of 12
FMDB 研究
2016/6/2
Jason
FMDB是什麼?
• FMDB是一款簡潔、易用的封裝庫。它是對
libsqlite3框架的封裝,用起來的步驟與SQLite
使用類似,並且它對於多線程的並發操作進
行了處理,所以是線程安全的。
FMDB V.S. SQLITE
• 優點
• 對多線程的並發操作進行處理,所以是線程安全的;
• 以OC的方式封裝了SQLite的C語言API,使用起來更加的方便;
• FMDB是輕量級的框架,使用靈活度高。
• 缺點
• 它是OC的語言封裝的,只能在iOS開發的時候使用,所以在實現跨平
台有局限性。
FMDB CLASS
• FMDatabase
• FMDatabase對象就代表一個單獨的SQLite資料庫,用來執行SQL
語句
• FMResultSet
• 使用FMDatabase執行查詢後的結果集
• FMDatabaseQueue
• 用於在多線程中執行多個查詢或更新,它是線程安全的
建立資料庫和表格
-(void)createDatabaseAndTable
{
// 1.獲得數據庫文件的路徑
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName = [doc stringByAppendingPathComponent:@"student.sqlite"];
// 2.獲得數據庫
db = [FMDatabase databaseWithPath:fileName];
// 3.使用如下語句,如果打開失敗,可能是權限不足或者資源不足。通常打開完操作操作後,需要調用close方法來關閉數據庫。在和
數據庫交互之前,數據庫必須是打開的。如果資源或權限不足無法打開或創建數據庫,都會導致打開失敗。
if ([db open])
{
// 4.創建表單
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (number integer PRIMARY KEY
AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
if (result)
{
NSLog(@"創建表單成功");
}
}
}
插入資料
-(void)insertData
{
NSString *name = @"HappyGirl";
int age = 16;
// 1.executeUpdate:不確定的參數用?來佔位(後面參數必須是oc對象,;代表語句結束)
[db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age)];
// 2.executeUpdateWithForamat:不確定的參數用%@,%d等來佔位(參數為原始數據類型,執行語句不區分大小寫)
// [db executeUpdateWithFormat:@"insert into t_student (name, age) values ​​(%@,%i);", name, age];
// 3.參數是數組的使用方式
[db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);" withArgumentsInArray:@[name, @(age)]];
}
更新資料
-(void)updateData
{
// 1.不確定的參數用?來佔位(後面參數必須是OC對象,需要將int包裝成OC對象)
int idNum = 3;
[db executeUpdate:@"delete from t_student where number = ?;", @(idNum)];
// 2.不確定的參數用%@,%d等來佔位
[db executeUpdateWithFormat:@"delete from t_student where name = %@;", @"Happyboy"];
// 修改學生的名字
[db executeUpdate:@"update t_student set name = ? where name = ?", @"HappyGL", @"Happygirl"];
}
丟棄表格
-(void)dropTable
{
// 如果表格存在則銷毀
[db executeUpdate:@"drop table if exists t_student;"];
}
選擇資料
-(void)selectData
{
// 查詢整個表
FMResultSet *resultSet = [db executeQuery:@"select * from t_student;"];
// 根據條件查詢
// FMResultSet *resultSet = [db executeQuery:@"select * from t_student where number <?;", @(20)];
NSString *resultStr = @"";
// 遍歷結果集合
while ([resultSet next]) {
int idNum = [resultSet intForColumn:@"number"];
NSString *name = [resultSet stringForColumn:@"name"];
int age = [resultSet intForColumn:@"age"];
NSString *rowStr = [NSString stringWithFormat:@"number: %i, name: %@, age: %in", idNum, name, age];
resultStr = [resultStr stringByAppendingString:rowStr];
resultTV.text = resultStr;
NSLog(@"%@", rowStr);
}
}
使用佇列
-(void)useQueue
{
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName = [doc stringByAppendingPathComponent:@"student.sqlite"];
NSString *name = @"HappyJoy";
int age = 36;
// 1.創建隊列
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:fileName];
__block BOOL whoopsSomethingWrongHappened = YES;
// 2.把任務包裝到事務裡
[queue inTransaction:^(FMDatabase *dbx, BOOL *rollback)
{
whoopsSomethingWrongHappened &= [dbx executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age)];
whoopsSomethingWrongHappened &= [dbx executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age+1)];
whoopsSomethingWrongHappened &= [dbx executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age+2)];
// 如果有錯誤返回
if (!whoopsSomethingWrongHappened)
{
*rollback = YES ;
return ;
}
}];
}
參考
• FMDB
https://github.com/ccgus/fmdb
A Cocoa / Objective-C wrapper around SQLite
• 在iOS開發中使用FMDB
http://blog.devtang.com/2012/04/22/use-fmdb/
• 數據庫第三方框架FMDB詳細講解
http://www.jianshu.com/p/e2dbd69b6db2
• [iOS] FMDB
http://lokanghung.blogspot.tw/2014/05/ios-fmdb.html
• FMDB–更友好地操作SQLite數據庫
http://www.ios122.com/2015/09/fmdb/
• 用SQLite 和FMDB 替代Core Data
http://objccn.io/issue-4-3/
• 數據持久化(三)使用第三方類庫FMDB
http://www.kancloud.cn/digest/data/106693

More Related Content

Similar to FMDB 研究

Objc under the_hood_2013
Objc under the_hood_2013Objc under the_hood_2013
Objc under the_hood_2013Michael Pan
 
Dive into kissy
Dive into kissyDive into kissy
Dive into kissyjay li
 
12, string
12, string12, string
12, stringted-xu
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计hanmo1988
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门Lucien Li
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starteryiming he
 
JdonFramework中文
JdonFramework中文JdonFramework中文
JdonFramework中文banq jdon
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记yiditushe
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC
 
02 Objective-C
02 Objective-C02 Objective-C
02 Objective-CTom Fan
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile ServicesKuo-Chun Su
 
Mysql开发与优化
Mysql开发与优化Mysql开发与优化
Mysql开发与优化isnull
 
Mysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimizationMysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimizationisnull
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹Johnny Sung
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则YUCHENG HU
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)Yan Li
 

Similar to FMDB 研究 (20)

Objc under the_hood_2013
Objc under the_hood_2013Objc under the_hood_2013
Objc under the_hood_2013
 
Dive into kissy
Dive into kissyDive into kissy
Dive into kissy
 
12, string
12, string12, string
12, string
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starter
 
JdonFramework中文
JdonFramework中文JdonFramework中文
JdonFramework中文
 
Why use MySQL
Why use MySQLWhy use MySQL
Why use MySQL
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧
 
02 Objective-C
02 Objective-C02 Objective-C
02 Objective-C
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
 
Mysql开发与优化
Mysql开发与优化Mysql开发与优化
Mysql开发与优化
 
Mysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimizationMysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimization
 
Web base 吴志华
Web base 吴志华Web base 吴志华
Web base 吴志华
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)
 

More from ShengWen Chiou

Crashlytics 使用教學
Crashlytics 使用教學Crashlytics 使用教學
Crashlytics 使用教學ShengWen Chiou
 
Xamarin.iOS中引用第三方Objective-C的Class Library
Xamarin.iOS中引用第三方Objective-C的Class LibraryXamarin.iOS中引用第三方Objective-C的Class Library
Xamarin.iOS中引用第三方Objective-C的Class LibraryShengWen Chiou
 
Xamarin.iOS中引用自製Objective-C的Class Library
Xamarin.iOS中引用自製Objective-C的Class LibraryXamarin.iOS中引用自製Objective-C的Class Library
Xamarin.iOS中引用自製Objective-C的Class LibraryShengWen Chiou
 
What’s New In watch OS
What’s New In watch OSWhat’s New In watch OS
What’s New In watch OSShengWen Chiou
 
Symbolicate Crash 使用教學
Symbolicate Crash 使用教學Symbolicate Crash 使用教學
Symbolicate Crash 使用教學ShengWen Chiou
 
Apple Watch Specifications
Apple Watch SpecificationsApple Watch Specifications
Apple Watch SpecificationsShengWen Chiou
 
Apple Watch UI Elements
Apple Watch UI ElementsApple Watch UI Elements
Apple Watch UI ElementsShengWen Chiou
 
Apple Watch Human Interface Guidelines
Apple Watch Human Interface GuidelinesApple Watch Human Interface Guidelines
Apple Watch Human Interface GuidelinesShengWen Chiou
 
CocoaPods 使用教學
CocoaPods 使用教學CocoaPods 使用教學
CocoaPods 使用教學ShengWen Chiou
 

More from ShengWen Chiou (20)

iOS Extension
iOS ExtensioniOS Extension
iOS Extension
 
Realm 研究
Realm 研究Realm 研究
Realm 研究
 
Crashlytics 使用教學
Crashlytics 使用教學Crashlytics 使用教學
Crashlytics 使用教學
 
DBAccess 研究
DBAccess 研究DBAccess 研究
DBAccess 研究
 
Xamarin.iOS中引用第三方Objective-C的Class Library
Xamarin.iOS中引用第三方Objective-C的Class LibraryXamarin.iOS中引用第三方Objective-C的Class Library
Xamarin.iOS中引用第三方Objective-C的Class Library
 
Xamarin.iOS中引用自製Objective-C的Class Library
Xamarin.iOS中引用自製Objective-C的Class LibraryXamarin.iOS中引用自製Objective-C的Class Library
Xamarin.iOS中引用自製Objective-C的Class Library
 
iBeacon 相關應用
iBeacon 相關應用iBeacon 相關應用
iBeacon 相關應用
 
Xamarin 研究
Xamarin 研究Xamarin 研究
Xamarin 研究
 
What’s New In watch OS
What’s New In watch OSWhat’s New In watch OS
What’s New In watch OS
 
Apple Watch Feature
Apple Watch FeatureApple Watch Feature
Apple Watch Feature
 
Symbolicate Crash 使用教學
Symbolicate Crash 使用教學Symbolicate Crash 使用教學
Symbolicate Crash 使用教學
 
Apple Watch Specifications
Apple Watch SpecificationsApple Watch Specifications
Apple Watch Specifications
 
Apple Watch UI Elements
Apple Watch UI ElementsApple Watch UI Elements
Apple Watch UI Elements
 
Apple Watch Human Interface Guidelines
Apple Watch Human Interface GuidelinesApple Watch Human Interface Guidelines
Apple Watch Human Interface Guidelines
 
AppleDoc 使用教學
AppleDoc 使用教學AppleDoc 使用教學
AppleDoc 使用教學
 
Quickblox Study
Quickblox StudyQuickblox Study
Quickblox Study
 
Auto layout 介紹
Auto layout 介紹Auto layout 介紹
Auto layout 介紹
 
iOS Touch ID 介紹
iOS Touch ID 介紹iOS Touch ID 介紹
iOS Touch ID 介紹
 
iOS Keychain 介紹
iOS Keychain 介紹iOS Keychain 介紹
iOS Keychain 介紹
 
CocoaPods 使用教學
CocoaPods 使用教學CocoaPods 使用教學
CocoaPods 使用教學
 

FMDB 研究

  • 3. FMDB V.S. SQLITE • 優點 • 對多線程的並發操作進行處理,所以是線程安全的; • 以OC的方式封裝了SQLite的C語言API,使用起來更加的方便; • FMDB是輕量級的框架,使用靈活度高。 • 缺點 • 它是OC的語言封裝的,只能在iOS開發的時候使用,所以在實現跨平 台有局限性。
  • 4. FMDB CLASS • FMDatabase • FMDatabase對象就代表一個單獨的SQLite資料庫,用來執行SQL 語句 • FMResultSet • 使用FMDatabase執行查詢後的結果集 • FMDatabaseQueue • 用於在多線程中執行多個查詢或更新,它是線程安全的
  • 5. 建立資料庫和表格 -(void)createDatabaseAndTable { // 1.獲得數據庫文件的路徑 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *fileName = [doc stringByAppendingPathComponent:@"student.sqlite"]; // 2.獲得數據庫 db = [FMDatabase databaseWithPath:fileName]; // 3.使用如下語句,如果打開失敗,可能是權限不足或者資源不足。通常打開完操作操作後,需要調用close方法來關閉數據庫。在和 數據庫交互之前,數據庫必須是打開的。如果資源或權限不足無法打開或創建數據庫,都會導致打開失敗。 if ([db open]) { // 4.創建表單 BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (number integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"]; if (result) { NSLog(@"創建表單成功"); } } }
  • 6. 插入資料 -(void)insertData { NSString *name = @"HappyGirl"; int age = 16; // 1.executeUpdate:不確定的參數用?來佔位(後面參數必須是oc對象,;代表語句結束) [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age)]; // 2.executeUpdateWithForamat:不確定的參數用%@,%d等來佔位(參數為原始數據類型,執行語句不區分大小寫) // [db executeUpdateWithFormat:@"insert into t_student (name, age) values ​​(%@,%i);", name, age]; // 3.參數是數組的使用方式 [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);" withArgumentsInArray:@[name, @(age)]]; }
  • 7. 更新資料 -(void)updateData { // 1.不確定的參數用?來佔位(後面參數必須是OC對象,需要將int包裝成OC對象) int idNum = 3; [db executeUpdate:@"delete from t_student where number = ?;", @(idNum)]; // 2.不確定的參數用%@,%d等來佔位 [db executeUpdateWithFormat:@"delete from t_student where name = %@;", @"Happyboy"]; // 修改學生的名字 [db executeUpdate:@"update t_student set name = ? where name = ?", @"HappyGL", @"Happygirl"]; }
  • 9. 選擇資料 -(void)selectData { // 查詢整個表 FMResultSet *resultSet = [db executeQuery:@"select * from t_student;"]; // 根據條件查詢 // FMResultSet *resultSet = [db executeQuery:@"select * from t_student where number <?;", @(20)]; NSString *resultStr = @""; // 遍歷結果集合 while ([resultSet next]) { int idNum = [resultSet intForColumn:@"number"]; NSString *name = [resultSet stringForColumn:@"name"]; int age = [resultSet intForColumn:@"age"]; NSString *rowStr = [NSString stringWithFormat:@"number: %i, name: %@, age: %in", idNum, name, age]; resultStr = [resultStr stringByAppendingString:rowStr]; resultTV.text = resultStr; NSLog(@"%@", rowStr); } }
  • 10. 使用佇列 -(void)useQueue { NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *fileName = [doc stringByAppendingPathComponent:@"student.sqlite"]; NSString *name = @"HappyJoy"; int age = 36; // 1.創建隊列 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:fileName]; __block BOOL whoopsSomethingWrongHappened = YES; // 2.把任務包裝到事務裡 [queue inTransaction:^(FMDatabase *dbx, BOOL *rollback) { whoopsSomethingWrongHappened &= [dbx executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age)]; whoopsSomethingWrongHappened &= [dbx executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age+1)]; whoopsSomethingWrongHappened &= [dbx executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);", name, @(age+2)]; // 如果有錯誤返回 if (!whoopsSomethingWrongHappened) { *rollback = YES ; return ; } }]; }
  • 11. 參考 • FMDB https://github.com/ccgus/fmdb A Cocoa / Objective-C wrapper around SQLite • 在iOS開發中使用FMDB http://blog.devtang.com/2012/04/22/use-fmdb/ • 數據庫第三方框架FMDB詳細講解 http://www.jianshu.com/p/e2dbd69b6db2
  • 12. • [iOS] FMDB http://lokanghung.blogspot.tw/2014/05/ios-fmdb.html • FMDB–更友好地操作SQLite數據庫 http://www.ios122.com/2015/09/fmdb/ • 用SQLite 和FMDB 替代Core Data http://objccn.io/issue-4-3/ • 數據持久化(三)使用第三方類庫FMDB http://www.kancloud.cn/digest/data/106693