工具:火狐瀏覽器+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; }
