轉載自 http://www.cnblogs.com/wendingding/p/3871848.html html
1、簡單說明git
1.什麼是FMDBgithub
FMDB是iOS平臺的SQLite數據庫框架sql
FMDB以OC的方式封裝了SQLite的C語言API數據庫
2.FMDB的優勢安全
使用起來更加面向對象,省去了不少麻煩、冗餘的C語言代碼多線程
對比蘋果自帶的Core Data框架,更加輕量級和靈活app
提供了多線程安全的數據庫操做方法,有效地防止數據混亂框架
3.FMDB的github地址dom
https://github.com/ccgus/fmdb
2、核心類
FMDB有三個主要的類
(1)FMDatabase
一個FMDatabase對象就表明一個單獨的SQLite數據庫
用來執行SQL語句
(2)FMResultSet
使用FMDatabase執行查詢後的結果集
(3)FMDatabaseQueue
用於在多線程中執行多個查詢或更新,它是線程安全的
3、打開數據庫
經過指定SQLite數據庫文件路徑來建立FMDatabase對象
FMDatabase *db = [FMDatabase databaseWithPath:path];
if (![db open]) {
NSLog(@"數據庫打開失敗!");
}
文件路徑有三種狀況
(1)具體文件路徑
若是不存在會自動建立
(2)空字符串@""
會在臨時目錄建立一個空的數據庫
當FMDatabase鏈接關閉時,數據庫文件也被刪除
(3)nil
會建立一個內存中臨時數據庫,當FMDatabase鏈接關閉時,數據庫會被銷燬
4、執行更新
在FMDB中,除查詢之外的全部操做,都稱爲「更新」
create、drop、insert、update、delete等
使用executeUpdate:方法執行更新
- (BOOL)executeUpdate:(NSString*)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
示例
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
5、執行查詢
查詢方法
- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
示例
// 查詢數據
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
// 遍歷結果集
while ([rs next]) {
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
}
6、代碼示例
1.新建一個項目,導入libsqlite3庫,並在項目中包含主頭文件
2.下載第三方框架FMDB
3.示例代碼
YYViewController.m文件
// // YYViewController.m // 04-FMDB基本使用 // // Created by apple on 14-7-27. // Copyright (c) 2014年 wendingding. All rights reserved. // #import "YYViewController.h" #import "FMDB.h" @interface YYViewController () @property(nonatomic,strong)FMDatabase *db; @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; //1.得到數據庫文件的路徑 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *fileName=[doc stringByAppendingPathComponent:@"student.sqlite"]; //2.得到數據庫 FMDatabase *db=[FMDatabase databaseWithPath:fileName]; //3.打開數據庫 if ([db open]) { //4.創表 BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"]; if (result) { NSLog(@"創表成功"); }else { NSLog(@"創表失敗"); } } self.db=db; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self delete]; [self insert]; [self query]; } //插入數據 -(void)insert { for (int i = 0; i<10; i++) { NSString *name = [NSString stringWithFormat:@"jack-%d", arc4random_uniform(100)]; // executeUpdate : 不肯定的參數用?來佔位 [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", name, @(arc4random_uniform(40))]; // [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);" withArgumentsInArray:@[name, @(arc4random_uniform(40))]]; // executeUpdateWithFormat : 不肯定的參數用%@、%d等來佔位 // [self.db executeUpdateWithFormat:@"INSERT INTO t_student (name, age) VALUES (%@, %d);", name, arc4random_uniform(40)]; } } //刪除數據 -(void)delete { // [self.db executeUpdate:@"DELETE FROM t_student;"]; [self.db executeUpdate:@"DROP TABLE IF EXISTS t_student;"]; [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"]; } //查詢 - (void)query { // 1.執行查詢語句 FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_student"]; // 2.遍歷結果 while ([resultSet next]) { int ID = [resultSet intForColumn:@"id"]; NSString *name = [resultSet stringForColumn:@"name"]; int age = [resultSet intForColumn:@"age"]; NSLog(@"%d %@ %d", ID, name, age); } } @end
打印查看結果:
提示:
若是ID設置爲逐漸,且設置爲自動增加的話,那麼把表中的數據刪除後,從新插入新的數據,ID的編號不是從0開始,而是接着以前的ID進行編號。
注意:
不要寫成下面的形式,不要加'',直接使用%@,它會自動認爲這是一個字符串。