FMDB簡單封裝和使用


工具:火狐瀏覽器+SQLite Manager插件 ; Xcode; FMDB庫;

效果:

項目地址: https://github.com/sven713/PackFMDB

主要參考這兩篇博客:

1. http://www.jianshu.com/p/dd170b1cbc3b iOS 基於FMDB簡單封裝

2. http://www.jianshu.com/p/54e74ce87404# FMDB的使用方法(附Demo)

使用步驟:

1.在工程中導入  libsqlite3.tdb

2.從GitHub下載FMDB庫,拖到項目中(或者使用cocoaPods安裝)  https://github.com/ccgus/fmdb

3.新建一個類,用於封裝FMDB,封裝一層肯定比直接使用要好一點,但是我這項目沒有封裝好,還要再調整. 不封裝的話就直接使用  FMDatabase 這個類了.

  參考這個博客,http://www.jianshu.com/p/dd170b1cbc3b 只封裝了下面一些簡單的接口:

#import <Foundation/Foundation.h>
#import "FMDB.h"
/*
* 封裝了FMDB的工具類 */ @interface FMDBHelp : NSObject @property (nonatomic, strong) FMDatabase *dataBase; //!<數據庫對象 /** 支持外界自定義數據庫文件名 @param dbName 自定義的數據庫文件名 */ - (void)createDBWithName:(NSString *)dbName; /** 沒有返回結果 @param sql sql語句 @return YES NO */ - (BOOL)noResultSetWithSql:(NSString *)sql; /** 有返回結果 @param sql sql @return 返回字典數組 */ - (NSArray<NSDictionary *> *)queryWithSql:(NSString *)sql; /** 單例 @return FMDBHelper */ +(instancetype)shareInstance; //- (void)insertTableName:(NSString *)tableName propertyKeyArray:(NSArray *)key value:(NSString *)values; /** *@brief 插入一個實體---參考HDF這個接口還不能用!!!!! *@param entity -要插入的實體,含有結果值的實體,設置用 *@return 操作成功與否 */ - (BOOL)insert:(id)entity tableName:(NSString *)tableName; @end

就 queryWithSql 這個方法用的比較多,封裝的可以用, 另外就是建表的時候用的一下第一個方法 createDBWithName

最后一個方法參考老東家的代碼,沒整好,還不能用

總之,這個封裝非常不完全,至少還要封裝出增刪改查四個接口

4.繼承UITableViewController,用死數據搭建UI

5.在FMDBHelp類的基礎上再封裝一個工具類:PersonCarDataBaseHelper 人車數據庫工具類, 所有控制器直接調用這個工具類的方法實現數據庫的增刪改查,這個類只能用於這個項目,其他項目還是要使用FMDB的API

  PersonCarDataBaseHelper 接口如下:

#import <Foundation/Foundation.h>
@class People;
@class Car;

/**
 人車數據庫工具類
 */
@interface PersonCarDataBaseHelper : NSObject

/**
 添加人物------增

 @param people 被加入的人物
 */
- (void)addPerson:(People *)people;


/**
 獲取人物列表----查

 @return 人物列表數組
 */
- (NSMutableArray *)getPersonArray;

/**
 刪除人物-------刪

 @param person 被刪除的人物
 */
- (void)deletePerson:(People *)person;


/**
 刪除某人的車---刪

 @param car 被刪除的車
 @param person 車所屬的人
 */
- (void)deletCar:(Car *)car owner:(People *)person;

/**
 向某人添加小車----增

 @param car 新添加小車
 @param person 車主
 */
- (void)addCar:(Car *)car toPerson:(People *)person;


/**
 查詢某人擁有的車-----查
 @param person 誰的車
 */
- (NSMutableArray *)getCarFromPerson:(People *)person;


/**
 修改person模型--改

 @param people 被修改的person
 */
- (void)updatePerson:(People *)people;


/**
 兩表關聯查詢----查

 @return 查詢結果數組
 */
- (NSMutableArray *)queryTwoTable;

+(instancetype)shareInstance;
@end

倒數第二個接口,  兩表關聯查詢----查 里面的Sql語句是寫死的,應該再封裝一下

6.增加人接口的實現:

  先打開數據庫,然后執行sql語句,最后再關閉數據庫

  直接調用FMDB的 - (BOOL)executeUpdate:(NSString*)sql, ...;這個方法(增)

- (void)addPerson:(People *)people {
   
    [[FMDBHelp shareInstance].dataBase open];
    
    NSNumber *maxID = @(0);
    
    FMResultSet *res = [[FMDBHelp shareInstance].dataBase executeQuery:@"SELECT * FROM person "];
    //獲取數據庫中最大的ID
    while ([res next]) { // 第一次循環沒有next,不會走進去這個判斷,maxID就是1 這個循環的作用就是拿到最后一個person_id,再加一,往后添加
        if ([maxID integerValue] < [[res stringForColumn:@"person_id"] integerValue]) { //  [res stringForColumn:@"person_id"]第一次是nil
            maxID = @([[res stringForColumn:@"person_id"] integerValue] ) ; // 如果maxID比personId小,就讓maxID = personID  person_id從1開始的?
        }
    }
    maxID = @([maxID integerValue] + 1);
    
    [[FMDBHelp shareInstance].dataBase executeUpdate:@"INSERT INTO person(person_id,person_name,person_age,person_updateTime)VALUES(?,?,?,?)",maxID,people.name,@(people.age),@(0)];
    
    [[FMDBHelp shareInstance].dataBase close];
}

7.查詢所有的人:

  先打開數據庫,然后執行sql語句,最后再關閉數據庫

  調用的自己封裝的方法 queryWithSql(其實是封裝的FMDB的 - (FMResultSet *)executeQuery:(NSString*)sql, ...;),對於不用傳參數的,可以直接使用封裝的方法,傳入Sql語句就可以執行了,返回查詢結果

- (NSMutableArray *)getPersonArray {
    NSArray *arr = [[FMDBHelp shareInstance] queryWithSql:@"SELECT * FROM person"];
    NSMutableArray *resultArr = [NSMutableArray array];
    for (NSDictionary *dict in arr) {
        People *person = [[People alloc]init];
        person.name = [dict objectForKey:@"person_name"];
        person.age = [[dict objectForKey:@"person_age"] integerValue];
        person.ID = [dict objectForKey:@"person_id"]; // person_id-->maxID-->person.ID
        person.updateTime = [[dict objectForKey:@"person_updateTime"] integerValue];
        [resultArr addObject:person];
    }
    return resultArr;
}

8.刪除某個人:

  直接調用FMDB的API - (BOOL)executeUpdate:(NSString*)sql, ...;

- (void)deletePerson:(People *)person {
    // 打開
    [[FMDBHelp shareInstance].dataBase open];
    // 執行
    [[FMDBHelp shareInstance].dataBase executeUpdate:@"DELETE FROM person WHERE person_id = ?", person.ID]; // executeQuery不行
    // 關閉
    [[FMDBHelp shareInstance].dataBase close];
}

9. 修改某個人的年齡:

  直接調用FMDB的API - (BOOL)executeUpdate:(NSString*)sql, ...;

- (void)updatePerson:(People *)people {
    FMDatabase *db = [FMDBHelp shareInstance].dataBase;
    [db open];
    NSNumber *updateNum = @(people.updateTime + 1);
    [db executeUpdate:@"UPDATE 'person' SET person_updateTime = ? WHERE person_id = ?", updateNum, people.ID]; 
    [db executeUpdate:@"UPDATE 'person' SET person_age = ? WHERE person_id = ?", @(people.age),people.ID];
    [db close];
}


總結:  只有查詢的時候用  - (FMResultSet *)executeQuery:(NSString*)sql, ...;

    其他時候用  - (BOOL)executeUpdate:(NSString*)sql, ...;

10. 給某人增加車:

  跟增加人類似,使用FMDB:- (BOOL)executeUpdate:(NSString*)sql, ...;     但是要先從人的表里面查出特定人的車

  車的own_id = person.ID,將own_id跟person.ID關聯

/**增加車*/
- (void)addCar:(Car *)car toPerson:(People *)person {
    FMDatabase *db = [FMDBHelp shareInstance].dataBase;
    [db open];
    NSString *sql = [NSString stringWithFormat:@"SELECT * FROM car WHERE own_id = %@",person.ID];
    FMResultSet *resultSet = [db executeQuery:sql];
    NSInteger maxID = 0;
    while ([resultSet next]) { // while 寫成了 if 循環就走一次,造成carID是相同
        if (maxID < [resultSet stringForColumn:@"car_id"].integerValue) {
            maxID = [resultSet stringForColumn:@"car_id"].integerValue;
        }
    }
    maxID = maxID + 1;
//    NSNumber *max = [NSNumber numberWithInteger:maxID];
    [db executeUpdate:@"INSERT INTO car(own_id,car_id,car_brand,car_price)VALUES(?,?,?,?)",person.ID,@(maxID),car.brand,@(car.price)]; // own_id == person_id car_id == maxID
    // maxID遞增,car_id也遞增  car_id作用類似person_id
    [db close];
}

11. 默認買車(增):

  跟增加人類似,直接用FMDB API - (BOOL)executeUpdate:(NSString*)sql, ...; 但是要傳查詢人的id

12.查詢某人擁有的車(查):

  跟查詢人類似,可以用封裝的方法(里面是FMDB的 - (FMResultSet *)executeQuery:(NSString*)sql, ...;),但是sql語句要傳查詢人的id.

13.刪除某人擁有的車(刪):

  跟刪除人類似,直接用FMDB API  - (BOOL)executeUpdate:(NSString*)sql, ...;, 要多傳一個參數 person_id

14. 多表關聯查詢:

  用自己封裝的API [[FMDBHelp shareInstance]queryWithSql:sql]; 前提是寫對傳入的sql語句,person_id寫死了,沒有封裝,只是用了一下

- (NSMutableArray *)queryTwoTable {
    NSMutableArray *arrMu = [NSMutableArray array];
    
    NSString *sql = @"SELECT person.person_name,car.id,car.car_brand  FROM car,person where car.own_id = person.id  and person.id=1";
    arrMu = [[[FMDBHelp shareInstance]queryWithSql:sql] copy];
    return arrMu;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM