iOS中 FMDB第三方SQLite資料庫 UI_20

來源:互聯網
上載者:User

標籤:第三方sqlite資料庫   fmdbdatabase   fmdbdatabasequeue   fmresultset   iosfmdm   

 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];}


調用:(介紹FMDB)

- (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;}


準備一個UIViewController:

DetailViewController.h@interface DetailViewController : UITableViewController@property(nonatomic,retain)NSMutableArray *dataSource;//屬性傳值使用@endDetailViewController.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;//基礎資料型別 (Elementary Data Type)可以省略記憶體修飾符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

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

iOS中 FMDB第三方SQLite資料庫 UI_20

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.