• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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];
    }


    調用:(介紹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;//屬性傳值使用
    @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

    版權聲明:本文為weixin_33675507原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_33675507/article/details/90332503

    智能推薦

    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...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡