最近在項目中需要在多個頁面對同樣的數(shù)據(jù)進行相關(guān)操作问畅,于是便用到了FMDB數(shù)據(jù)庫操作娃属,以下便是FMDB的一些簡單的使用方法。附Demo一份:FMDBDemo
1.為了更好的的進行管理护姆,先創(chuàng)建了FMDB的單例
@interface DataBase : NSObject
+ (instancetype)sharedDataBase;
#import "DataBase.h"
#import <FMDB.h>
#import "Person.h"
#import "Car.h"
static DataBase *_DBCtl = nil;
@interface DataBase()<NSCopying,NSMutableCopying>{
FMDatabase *_db;
}
@end
@implementation DataBase
+(instancetype)sharedDataBase{
if (_DBCtl == nil) {
_DBCtl = [[DataBase alloc] init];
[_DBCtl initDataBase];
}
return _DBCtl;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
if (_DBCtl == nil) {
_DBCtl = [super allocWithZone:zone];
}
return _DBCtl;
}
-(id)copy{
return self;
}
-(id)mutableCopy{
return self;
}
-(id)copyWithZone:(NSZone *)zone{
return self;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
return self;
}
-(void)initDataBase{
// 獲得Documents目錄路徑
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 文件路徑
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"model.sqlite"];
// 實例化FMDataBase對象
_db = [FMDatabase databaseWithPath:filePath];
[_db open];
// 初始化數(shù)據(jù)表
NSString *personSql = @"CREATE TABLE 'person' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,'person_id' VARCHAR(255),'person_name' VARCHAR(255),'person_age' VARCHAR(255),'person_number'VARCHAR(255)) ";
NSString *carSql = @"CREATE TABLE 'car' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,'own_id' VARCHAR(255),'car_id' VARCHAR(255),'car_brand' VARCHAR(255),'car_price'VARCHAR(255)) ";
[_db executeUpdate:personSql];
[_db executeUpdate:carSql];
[_db close];
}
現(xiàn)在創(chuàng)建好了數(shù)據(jù)庫矾端,可以保存person對象與car對象的相關(guān)屬性
數(shù)據(jù)庫中創(chuàng)建了兩張表person表與car表,分別管理person的數(shù)據(jù)與car的數(shù)據(jù)卵皂,通過person_id 與own_id進行關(guān)聯(lián)
2.提供接口
#pragma mark - Person
/**
* 添加person
*
*/
- (void)addPerson:(Person *)person;
/**
* 刪除person
*
*/
- (void)deletePerson:(Person *)person;
/**
* 更新person
*
*/
- (void)updatePerson:(Person *)person;
/**
* 獲取所有數(shù)據(jù)
*
*/
- (NSMutableArray *)getAllPerson;
#pragma mark - Car
/**
* 給person添加車輛
*
*/
- (void)addCar:(Car *)car toPerson:(Person *)person;
/**
* 給person刪除車輛
*
*/
- (void)deleteCar:(Car *)car fromPerson:(Person *)person;
/**
* 獲取person的所有車輛
*
*/
- (NSMutableArray *)getAllCarsFromPerson:(Person *)person;
/**
* 刪除person的所有車輛
*
*/
- (void)deleteAllCarsFromPerson:(Person *)person;
3.接口的實現(xiàn)
#pragma mark - 接口
- (void)addPerson:(Person *)person{
[_db open];
NSNumber *maxID = @(0);
FMResultSet *res = [_db executeQuery:@"SELECT * FROM person "];
//獲取數(shù)據(jù)庫中最大的ID
while ([res next]) {
if ([maxID integerValue] < [[res stringForColumn:@"person_id"] integerValue]) {
maxID = @([[res stringForColumn:@"person_id"] integerValue] ) ;
}
}
maxID = @([maxID integerValue] + 1);
[_db executeUpdate:@"INSERT INTO person(person_id,person_name,person_age,person_number)VALUES(?,?,?,?)",maxID,person.name,@(person.age),@(person.number)];
[_db close];
}
- (void)deletePerson:(Person *)person{
[_db open];
[_db executeUpdate:@"DELETE FROM person WHERE person_id = ?",person.ID];
[_db close];
}
- (void)updatePerson:(Person *)person{
[_db open];
[_db executeUpdate:@"UPDATE 'person' SET person_name = ? WHERE person_id = ? ",person.name,person.ID];
[_db executeUpdate:@"UPDATE 'person' SET person_age = ? WHERE person_id = ? ",@(person.age),person.ID];
[_db executeUpdate:@"UPDATE 'person' SET person_number = ? WHERE person_id = ? ",@(person.number + 1),person.ID];
[_db close];
}
- (NSMutableArray *)getAllPerson{
[_db open];
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
FMResultSet *res = [_db executeQuery:@"SELECT * FROM person"];
while ([res next]) {
Person *person = [[Person alloc] init];
person.ID = @([[res stringForColumn:@"person_id"] integerValue]);
person.name = [res stringForColumn:@"person_name"];
person.age = [[res stringForColumn:@"person_age"] integerValue];
person.number = [[res stringForColumn:@"person_number"] integerValue];
[dataArray addObject:person];
}
[_db close];
return dataArray;
}
/**
* 給person添加車輛
*
*/
- (void)addCar:(Car *)car toPerson:(Person *)person{
[_db open];
//根據(jù)person是否擁有car來添加car_id
NSNumber *maxID = @(0);
FMResultSet *res = [_db executeQuery:[NSString stringWithFormat:@"SELECT * FROM car where own_id = %@ ",person.ID]];
while ([res next]) {
if ([maxID integerValue] < [[res stringForColumn:@"car_id"] integerValue]) {
maxID = @([[res stringForColumn:@"car_id"] integerValue]);
}
}
maxID = @([maxID integerValue] + 1);
[_db executeUpdate:@"INSERT INTO car(own_id,car_id,car_brand,car_price)VALUES(?,?,?,?)",person.ID,maxID,car.brand,@(car.price)];
[_db close];
}
/**
* 給person刪除車輛
*
*/
- (void)deleteCar:(Car *)car fromPerson:(Person *)person{
[_db open];
[_db executeUpdate:@"DELETE FROM car WHERE own_id = ? and car_id = ? ",person.ID,car.car_id];
[_db close];
}
/**
* 獲取person的所有車輛
*
*/
- (NSMutableArray *)getAllCarsFromPerson:(Person *)person{
[_db open];
NSMutableArray *carArray = [[NSMutableArray alloc] init];
FMResultSet *res = [_db executeQuery:[NSString stringWithFormat:@"SELECT * FROM car where own_id = %@",person.ID]];
while ([res next]) {
Car *car = [[Car alloc] init];
car.own_id = person.ID;
car.car_id = @([[res stringForColumn:@"car_id"] integerValue]);
car.brand = [res stringForColumn:@"car_brand"];
car.price = [[res stringForColumn:@"car_price"] integerValue];
[carArray addObject:car];
}
[_db close];
return carArray;
}
- (void)deleteAllCarsFromPerson:(Person *)person{
[_db open];
[_db executeUpdate:@"DELETE FROM car WHERE own_id = ?",person.ID];
[_db close];
}
提供了公共接口之后秩铆,在任何一個頁面都能進行數(shù)據(jù)的操作
4 使用
1).添加數(shù)據(jù)
添加person.png
只要在右上角的點擊事件中填寫如下代碼,可以很快的在數(shù)據(jù)庫中添加person數(shù)據(jù)
/**
* 添加數(shù)據(jù)到數(shù)據(jù)庫
*/
- (void)addData{
NSLog(@"addData");
int nameRandom = arc4random_uniform(1000);
NSInteger ageRandom = arc4random_uniform(100) + 1;
NSString *name = [NSString stringWithFormat:@"person_%d號",nameRandom];
NSInteger age = ageRandom;
Person *person = [[Person alloc] init];
person.name = name;
person.age = age;
[[DataBase sharedDataBase] addPerson:person];
self.dataArray = [[DataBase sharedDataBase] getAllPerson];
[self.tableView reloadData];
}
2).刪除數(shù)據(jù)
刪除car.png
刪除某個person的某輛car
/**
* 設(shè)置刪除按鈕
*
*/
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if (editingStyle == UITableViewCellEditingStyleDelete){
Car *car = self.carArray[indexPath.row];
NSLog(@"car.id--%@,own_id--%@",car.car_id,car.own_id);
[[DataBase sharedDataBase] deleteCar:car fromPerson:self.person];
self.carArray = [[DataBase sharedDataBase] getAllCarsFromPerson:self.person];
[self.tableView reloadData];
}
}
3).修改數(shù)據(jù)
修改person的name 與 age
更新person.png
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// /****************跳轉(zhuǎn)頁面 查看car***************/
// PersonCarsViewController *pcvc = [[PersonCarsViewController alloc] init];
// pcvc.person = self.dataArray[indexPath.row];
//
// [self.navigationController pushViewController:pcvc animated:YES];
//
/****************person的更新操作***************/
Person *person = self.dataArray[indexPath.row];
person.name = [NSString stringWithFormat:@"%@",person.name];
person.age = arc4random_uniform(100) + 1;
[[DataBase sharedDataBase] updatePerson:person];
self.dataArray = [[DataBase sharedDataBase] getAllPerson];
[self.tableView reloadData];
}
4).查看數(shù)據(jù)
查看所有數(shù)據(jù).png
self.dataArray = [[DataBase sharedDataBase] getAllPerson];
for (int i = 0 ; i < self.dataArray.count; i++) {
Person *person = self.dataArray[i];
NSMutableArray *carArray = [[DataBase sharedDataBase] getAllCarsFromPerson:person];
[self.carArray addObject:carArray];
}
以上便是通過FMDB對對象數(shù)據(jù)進行了有效的保存灯变,同時使用單例能夠很方便的在各個控制器進行數(shù)據(jù)的操作殴玛,希望這個demo能夠幫到大家快速的使用FMDB進行數(shù)據(jù)的儲存操作。(__)