1.FMDB簡單介紹
iOS中原生的SQLite API在使用上相當(dāng)不友好,在使用時,非常不便。于是,就出現(xiàn)了一系列將SQLite API進(jìn)行封裝的庫FMDB (https://github.com/ccgus/fmdb) 是一款簡潔爆土、易用的封裝庫
FMDB同時兼容ARC和非ARC工程,會自動根據(jù)工程配置來調(diào)整相關(guān)的內(nèi)存管理代碼诸蚕。
FMDB常用類:
FMDatabase : 一個單一的SQLite數(shù)據(jù)庫步势,用于執(zhí)行SQL語句。
FMResultSet :執(zhí)行查詢一個FMDatabase結(jié)果集背犯。 FMDatabaseQueue :在多個線程來執(zhí)行查詢和更新時會使用這個類坏瘩。
創(chuàng)建數(shù)據(jù)庫:
db = [FMDatabase databaseWithPath:database_path];
● FMDB優(yōu)點:
1.使用起來更加面向?qū)ο螅∪チ撕芏嗦闊┠骸⑷哂嗟腃語言代碼
2.對比蘋果自帶的CoreData框架倔矾,更加輕量級和靈活
3.提供多線程安全,有效地防止數(shù)據(jù)混亂柱锹,原來的SQLite不是線程安全的
● FMDB缺點:
因為是OC語言封裝的哪自,失去了SQLite原來的跨平臺性(相對于其他語言)
2.效果圖
3.注意點
1.使用cocoapods
或者去下載FMDBsdk拖進(jìn)工程中
2.須導(dǎo)入libsqlite3.0.tbd依賴庫
4.代碼展示
1.創(chuàng)建模型用于接受數(shù)據(jù)
import "model.h"
.h
//分類
@property(nonatomic,strong) NSString *classify;
//書名
@property(nonatomic,strong) NSString *bookName;
//價格
@property(nonatomic,strong) NSString *bookPrice;
//作者
@property(nonatomic,strong) NSString *bookAuthor;
//備注
@property(nonatomic,strong) NSString *remark;
//id
@property(nonatomic,assign) NSInteger bookID;
2.創(chuàng)建業(yè)務(wù)處理層用于處理數(shù)據(jù)
.h
#import "FMDatabase.h"
#import "model.h"
@interface loadData : NSObject
//單例
+(instancetype)shareLoadData;
//添加
-(void)addBook:(model *)mode;
//查詢
-(NSMutableArray *)marr;
//修改
-(void)changeBook:(model *)model;
//刪除
-(void)deleteBook:(model *)model;
.m
#import "loadData.h"
static loadData *ld =nil;
static FMDatabase *fate;
@implementation loadData
//單例
+(instancetype)shareLoadData
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ld = [[loadData alloc]init];
[ld initA];
});
return ld;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
if (!ld) {
ld = [super allocWithZone:zone];
}
return ld;
}
-(id)copy
{
return self;
}
-(id)mutableCopy
{
return self;
}
//初始化數(shù)據(jù)庫
-(void)initA{
//創(chuàng)建沙盒
NSString *Ste = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
//定義文件名
NSString *path = [Ste stringByAppendingPathComponent:@"HousingInfo.sqlite"];
//初始化
fate = [[FMDatabase alloc]initWithPath:path];
//判斷
if ([fate open]) {
//初始化
[fate executeUpdate:@"create table class (bookID integer primary key, classify text, bookName text , bookPrice text , bookAuthor text , remark text)"];
[fate close];
NSLog(@"成功");
}else{
NSLog(@"失敗");
}
}
//添加
-(void)addBook:(model *)mode
{
BOOL isc = false;
NSArray *arr = [self marr];
for (model *m in arr) {
if ([m.classify isEqualToString:mode.classify] && [m.bookName isEqualToString:mode.bookName]&&[m.bookPrice isEqualToString:mode.bookPrice]&&[m.bookAuthor isEqualToString:mode.bookAuthor]&&[m.remark isEqualToString:mode.remark]) {
isc = true;
}
}
if (isc) {
NSLog(@"數(shù)據(jù)相同");
}else{
[fate open];
BOOL isb = [fate executeUpdate:[NSString stringWithFormat:@"insert into class values (null , '%@','%@','%@','%@','%@')",mode.classify,mode.bookName,mode.bookPrice,mode.bookAuthor,mode.remark]];
if (isb) {
NSLog(@"添加成功");
}else{
NSLog(@"添加失敗");
}
[fate close];
}
//查詢
-(NSMutableArray *)marr
{
//初始化
NSMutableArray *marr = [NSMutableArray new];
//開始
[fate open];
//初始化
FMResultSet *Set = [[FMResultSet alloc]init];
//使用set接受
Set = [fate executeQuery:@"select *from class"];
//判斷
while ([Set next]) {
//初始化
model *mm = [model new];
//鏈接
mm.classify = [Set stringForColumn:@"classify"];
mm.bookName = [Set stringForColumn:@"bookName"];
mm.bookPrice = [Set stringForColumn:@"bookPrice"];
mm.bookAuthor = [Set stringForColumn:@"bookAuthor"];
mm.remark = [Set stringForColumn:@"remark"];
mm.bookID = [Set intForColumn:@"bookID"];
//添加到數(shù)組
[marr addObject:mm];
}
//關(guān)閉
[fate close];
//返回值
return marr;
}
//修改
-(void)changeBook:(model *)model
{
//開始
[fate open];
//初始化
NSString *str = [NSString stringWithFormat:@"update class set classify = '%@',bookName = '%@',bookPrice = '%@',bookAuthor = '%@',remark = '%@' where bookID = '%ld'",model.classify,model.bookName,model.bookPrice,model.bookAuthor,model.remark,model.bookID];
//BOOL值接受
BOOL ii = [fate executeUpdate:str];
//判斷
if (ii) {
NSLog(@"成功");
}else{
NSLog(@"失敗");
}
//關(guān)閉
[fate close];
}
//刪除
-(void)deleteBook:(model *)model
{
//開始
[fate open];
//初始化
NSString *str = [NSString stringWithFormat:@"delete from class where bookID = '%ld' ",model.bookID];
//BOOL值接受
BOOL ii = [fate executeUpdate:str];
//判斷
if (ii) {
NSLog(@"成功");
}else{
NSLog(@"失敗");
}
//關(guān)閉
[fate close];
}
@end
3.數(shù)據(jù)進(jìn)行展示
//將要顯示
-(void)viewWillAppear:(BOOL)animated{
//查詢
Marr = [[loadData shareLoadData]marr];
//刷新
[tabele reloadData ];//這個是展示在表格中的
}
4.數(shù)據(jù)添加頁面
#import "model.h"
#import "loadData.h"
@interface addViewController ()
@property (weak, nonatomic) IBOutlet UITextField *classiftyTF;
@property (weak, nonatomic) IBOutlet UITextField *bookNameTF;
@property (weak, nonatomic) IBOutlet UITextField *bookAuthorTF;
@property (weak, nonatomic) IBOutlet UITextField *bookpriceTF;
@property (weak, nonatomic) IBOutlet UITextField *remarkTF;
@end
@implementation addViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (IBAction)add:(id)sender {
//初始化
model *mm = [model new];
//鏈接
mm.classify =self.classiftyTF.text;
mm.bookName =self.bookNameTF.text;
mm.bookPrice =self.bookpriceTF.text;
mm.bookAuthor =self.bookpriceTF.text;
mm.remark =self.remarkTF.text;
//添加到數(shù)據(jù)庫
[[loadData shareLoadData]addBook:mm];
//跳轉(zhuǎn)
[self.navigationController popViewControllerAnimated:YES];
}
5.數(shù)據(jù)修改界面
從原界面到修改界面有一步傳值操作(屬性傳值)
#import "model.h"
#import "loadData.h"
@interface changeViewController ()
@property (weak, nonatomic) IBOutlet UITextField *classityTF;
@property (weak, nonatomic) IBOutlet UITextField *bookAuthorTF;
@property (weak, nonatomic) IBOutlet UITextField *bookPriceTF;
@property (weak, nonatomic) IBOutlet UITextField *bookNameTF;
@property (weak, nonatomic) IBOutlet UITextField *remarkTF;
@end
@implementation changeViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
//將數(shù)據(jù)添加到修改頁面
self.classityTF.text =self.mm.classify;
self.bookNameTF.text =self.mm.bookName;
self.bookPriceTF.text =self.mm.bookPrice;
self.bookAuthorTF.text =self.mm.bookAuthor;
self.remarkTF.text =self.mm.remark;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)change:(id)sender {
//初始化
model *mm = self.mm;
//鏈接
mm.classify = self.classityTF.text;
mm.bookName = self.bookNameTF.text;
mm.bookPrice = self.bookPriceTF.text;
mm.bookAuthor = self.bookAuthorTF.text;
mm.remark = self.remarkTF.text;
//添加
[[loadData shareLoadData]changeBook:mm];
//跳轉(zhuǎn)
[self.navigationController popViewControllerAnimated:YES];
}