iOS中 FMDB第三方SQLite數據庫 UI_20
1.什么是FMDB?
FMDB是iOS平臺下SQLite數據庫,只不過它是OC方式封裝了C語言的SQLite語句,使用起來更加面向對象
2.FMDB的優點:1.使用起來更加面向對象; 2.對比蘋果自帶的 Core Data 數據管理工具更加的輕量級,更加的靈活,而且FMDB支持跨平臺; 3.提供多線程下的數據安全保護機制,有效地防止數據混亂
3.FMDM中重要的類:
FMDBDataBase: 它代表一個數據庫對象,(我們需要創建數據庫對象時就使用這個類)
FMDBDataBaseQueue: 它提供多線程下執行查找刪除,或者更新的數據安全保護
FMResultSet: 用來存儲sql語句執行結果的集(我們執行完sql語句后得到的結果都在這個類的對象中)
ViewController.m
#import "FMDB.h"
#import "Person.h"
#import "DetailViewController.h"
@interface ViewController ()
@property(nonatomic,retain)FMDatabase *db;
@property(nonatomic,retain)NSMutableArray *dataArray;//存儲查詢到的所有Person對象
@end
@implementation ViewController
- (void)dealloc
{
self.db = nil;
self.dataArray = nil;
[super dealloc];
}
- (NSMutableArray *)dataArray{
if (_dataArray == nil) {
self.dataArray = [NSMutableArray arrayWithCapacity:0];
}
return [[_dataArray retain]autorelease];
}
- (void)viewDidLoad {
[super viewDidLoad];
//獲取Documents文件夾路徑
NSString *urlString = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//在Documents文件夾里創建數據庫文件 db.sqlite
NSString *dbPath = [urlString stringByAppendingPathComponent:@"db.sqlite"];
//創建數據庫對象
//參數:數據庫的路徑
//執行結束后并沒有幫我們生成數據庫文件,只是幫我們創建了數據庫對象
FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
NSLog(@"%@",NSHomeDirectory());
//代開數據庫
//open操作才幫我們真正的創建數據庫文件,且如果已經打開,直接返回YES,此時可以直接使用,如果打開失敗會打印報錯信息
BOOL isOpen = [db open];
if (isOpen) {
NSLog(@"打開成功");
//創建表格
//executeUpdate 除了查詢之外,其他數據創建表格,插入數據、刪除數據都是用這個方法
//blob 二進制流 相當于oc的NSData
BOOL isCreat = [db executeUpdate:@"create table if not exists Person(id integer primary key autoincrement,name text,gender text,age integer,photo blob)"];
NSLog(@"%@",isCreat ? @"建表成功":@"建表失敗");
}else{
NSLog(@"打開失敗");
}
//給屬性賦值
self.db = db;
NSLog(@"%@",NSHomeDirectory());
}
插入:
- (IBAction)insert:(UIButton *)sender {
Person *p = [[Person alloc]initWithName:@"郭美美" gender:@"女" age:20 photo:[UIImage imageNamed:@"3.gif"]];
//將圖片轉化成NSData對象
NSData *data = UIImagePNGRepresentation(p.photo);
//@(p.age)參數必須是對象類型的才能使用
//插入操作
BOOL isInsert = [self.db executeUpdate:@"insert into Person(name,gender,age,photo)values(?,?,?,?)",p.name,p.gender,@(p.age),data];
NSLog(@"%@",isInsert ? @"插入成功":@"插入失敗");
}
刪除:
- (IBAction)delete:(UIButton *)sender {
//根據條件刪除
BOOL result = [self.db executeUpdate:@"delete from Person where id = ?",@3];
NSLog(@"%@",result ? @"刪除成功":@"刪除失敗");
//刪除全部表格內容
// BOOL isResult1 = [self.db executeUpdate:@"delete from Person"];
//刪除表格
// BOOL isResult2 = [self.db executeUpdate:@"drop table Person"];
}
更新:
- (IBAction)update:(UIButton *)sender {
BOOL isUpdate = [self.db executeUpdate:@"update Person set gender = ? where id = ?",@"男",@4];
NSLog(@"%@",isUpdate ? @"更新成功":@"更新失敗");
}
查詢:
- (IBAction)select:(UIButton *)sender {
//查詢全部
FMResultSet *set = [self.db executeQuery:@"select * from Person"];
//按條件查詢
// FMResultSet *set = [self.db executeQuery:@"select *from Person where name = ?",@"郭美美"];
self.dataArray = [NSMutableArray arrayWithCapacity:0];
//循環取出表中的數據
//[set next] 判斷寫一行是否有數據
while ([set next]) {
//取出每一個字段對應的數據
NSInteger ID = [set intForColumn:@"id"];//取出id字段下的數據
NSString *name = [set stringForColumn:@"name"];//取出name字段下的數據
NSString *gender = [set stringForColumn:@"gender"];//取出gender字段下的數據
NSInteger age = [set intForColumn:@"age"];//取出age字段下的數據
NSData *data = [set dataForColumn:@"photo"];//取出photo字段下的數據
//創建model類
//將二進制流轉成圖片
UIImage *image = [UIImage imageWithData:data];
Person *p = [[Person alloc]initWithName:name gender:gender age:age photo: image];
p.ID = ID;
[self.dataArray addObject:p];
[p release];
}
}
為了展現效果,我們push到下個頁面查看效果:
需要準備一個自定義cell、UIViewController界面和model類
傳值使用:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//獲取segue起始端的視圖控制器對象
ViewController *rootVC = [segue sourceViewController];
//通過segue完成跳轉的時候會觸發這個方法,在跳轉之前觸發,一般用來傳值
//獲取push過去后的視圖控制器對象
DetailViewController *detailVC = [segue destinationViewController];
//屬性傳值
detailVC.dataSource = rootVC.dataArray;
}
DetailViewController.h
@interface DetailViewController : UITableViewController
@property(nonatomic,retain)NSMutableArray *dataSource;//屬性傳值使用
@end
DetailViewController.m
#import "DetailViewController.h"
#import "Person.h"
#import "PersonCell.h"
#define kPersonCell @"personcell"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (void)dealloc
{
self.dataSource = nil;
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return self.dataSource.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:kPersonCell forIndexPath:indexPath];
//建立model類
Person *person = self.dataSource[indexPath.row];
//調用cell賦值的方法
[cell assginValues:person];
return cell;
}
準備一個自定義cell:通過storyBoard實現;
布局如下:
PersonCell.h
#import <UIKit/UIKit.h>
@class Person;
@interface PersonCell : UITableViewCell
@property (retain, nonatomic) IBOutlet UILabel *nameLabel;
@property (retain, nonatomic) IBOutlet UILabel *genderLabel;
@property (retain, nonatomic) IBOutlet UILabel *ageLabel;
@property (retain, nonatomic) IBOutlet UIImageView *photoView;
@property (retain, nonatomic) IBOutlet UILabel *IDLabel;
//寫一個賦值方式
- (void)assginValues : (Person *)person;
@end
//=================================================
PersonCell.m
#import "PersonCell.h"
#import "Person.h"
@implementation PersonCell
- (void)awakeFromNib {
// Initialization code
}
//寫一個賦值方式
- (void)assginValues : (Person *)person{
self.nameLabel.text = person.name;
self.genderLabel.text = person.gender;
self.ageLabel.text = [NSString stringWithFormat:@"%ld",person.age];
self.photoView.image = person.photo;
self.IDLabel.text = [NSString stringWithFormat:@"%ld",person.ID];
}
- (void)dealloc {
[_nameLabel release];
[_genderLabel release];
[_ageLabel release];
[_photoView release];
[_IDLabel release];
[super dealloc];
}
@end
準備一個model類:
Person.h
#import <Foundation/Foundation.h>
@class UIImage;
@interface Person : NSObject
@property(nonatomic,copy)NSString *name,*gender;
@property(nonatomic)NSInteger age,ID;//基本數據類型可以省略內存修飾符assign,因為默認使用的就是assign
@property(nonatomic,retain)UIImage *photo;
//自定義初始化方法
- (id)initWithName : (NSString *)name gender : (NSString *)gender age : (NSInteger)age photo : (UIImage *)photo;
@end
//=============================
Person.m
#import "Person.h"
#import <UIKit/UIKit.h>
@implementation Person
- (void)dealloc
{
self.name = nil;
self.gender = nil;
self.photo = nil;
[super dealloc];
}
//自定義初始化方法
- (id)initWithName : (NSString *)name gender : (NSString *)gender age : (NSInteger)age photo : (UIImage *)photo{
if (self = [super init]) {
self.name = name;
self.gender = gender;
self.age = age;
self.photo = photo;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %@ %ld %@", self.name,self.gender,self.age,self.photo];
}
@end
大概效果不能展示全部(僅供參考):
==============================
第三方FMDB下載:http://pan.baidu.com/s/1ntMo3ZN
智能推薦
CocoaPodsi :iOS項目中第三方開源庫的管理工具
http://www.code4app.com/article/cocoapods-install-usage https://my.oschina.net/w11h22j33/blog/206129 淘寶的 ruby 源已經不維護了,請替換成 Ruby China,詳情請見:https://gems.ruby-china.org/ 更新gem sudo gem update&...
iOS第三方類庫IIViewDeck使用方法
項目中根據需求用到了一個界面框架:ViewDeck。項目需要用到左側右側各有一個抽屜視圖,而這個類庫可以極其簡單的實現這個功能,不單單是左右各一個,它可以隨意設置上下左右的抽屜視圖,簡直是360度想怎么抽怎么抽,這里記錄一下使用方法。 上方是Navbar,左邊有一個按鈕用來開啟左邊視圖,當然左右視圖都是可以通過左右滑動來開啟的,中間的Label顯示這是哪里的界面,左側有個Button用來測試中間界...
iOS SDK(第三方庫)上傳到github+ cocoapods管理
一.先在github新建一個倉庫; 2.克隆到本地:git clone xxxx 3.把要上傳的SDK添加到 克隆下來的倉庫文件夾里; 二:更新CocoaPods版本 1.查看cocoapods版本:pod --version 2.如果要更新可以輸入命令:sudo gem install cocoapods 3.查看自己CocoaPods賬戶:pod trunk me 4.如果本地沒有記錄自己tr...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...