@SQLite是一種小型的輕量級的關系型數據庫,在移動設備上使用是非常好的選擇,無論是Android還是IOS,都內置了SQLite數據庫,現在的版本都是SQLite3。在IOS中使用SQLite如果使用SDK提供的方法,特別麻煩也不利于理解和使用,感覺使用很不方便,今天就講講一個針對IOS的SQlite API封裝的第三方庫FMDB,FMDB對SDK中的API做了一層封裝,使之使用OC來訪問,使用方便而且更熟悉。FMDB的下載地址[https://github.com/ccgus/fmdb](https://github.com/ccgus/fmdb)。
@FMDB主要涉及兩個類,FMDatabase和FMResultSet?下載完FMDB源碼后把文件拖到工程中,并導入SQLite支持 ? ? ? ?庫,libsqlite3.0.dylib
~~~
#import "HMTDataBaseHandle.h"
#import "FMDB.h"
#import "HMTPerson.h"
@implementation HMTDataBaseHandle
static 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,[NSString stringWithFormat:@"%i",person.personAge]];
[self closeDataBase];
}
#pragma mark - 刪除數據操作----- executeUpdate
- (void)deleteDataFromDataBase:(HMTPerson *)person{
[self openDataBase];
[database executeUpdate:@" DELETE FROM Person WHERE id = ?",[NSString stringWithFormat:@"%i",person.personId]];
[self closeDataBase];
}
#pragma mark - 更新數據操作----- executeUpdate
- (void)updateFromDataBase:(HMTPerson *)person{
[self openDataBase];
[database executeUpdate:@" UPDATE Person SET name = ? WHERE id = ?",person.personName,[NSString stringWithFormat:@"%i",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,name,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的管理。
~~~
-(void)executeDBOperation
{
//獲取Document文件夾下的數據庫文件,沒有則創建
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];
FMDatabaseQueue *databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
[databaseQueue inDatabase:^(FMDatabase *db){
[db executeUpdate:@"insert into user values (?,?,?)",@"Ren",@"Male",[NSNumber numberWithInt:20]];
}];
[databaseQueue close];
}
~~~
- 前言
- 沙盒機制與文件(一)
- 沙盒機制和文件(二)
- 沙盒機制和文件(三)
- NSBundle介紹以及讀取沙盒文件路徑問題
- 數據持久化(一)-----歸檔 讀寫 文件路徑
- 數據持久化(二)-----Sqlite
- 數據持久化(三)使用第三方類庫FMDB
- 數據持久化(四)之NSUserDefaults
- 數據持久化(五)之CoreData
- 數據持久化(六)之Using CoreData with MagicalRecord
- 數據解析(一)解析XML之系統自帶NSXMLParse類
- 數據解析(二)解析XML之GDataXMLNode
- 數據解析(三)解析JSON-----系統自帶NSJSONSerialization 與 第三方JSONKit
- iOS多線程編程(一)NSThread
- iOS多線程編程(二)NSOperationQueue
- iOS多線程編程(三)Grand Central Dispatch(GCD)詳解
- iOS網絡編程(一)NSURLConnection
- iOS網絡編程(二) 自定義請求網絡類----推薦用于需要請求過程片段數據
- iOS網絡編程(三) 異步加載及緩存圖片---->SDWebImage
- iOS網絡編程(四) 異步加載及緩存圖片-----自定義類
- iOS網絡編程(五) 異步加載及緩存圖片-----EGO
- iOS網絡編程(六) NSURLSession詳解
- iOS網絡編程(7) 第三方開源庫----->AFNetworking