• <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學習筆記15——SQLite數據庫

    SQLite是MySQL的簡化版,更多的運用與移動設備或小型設備上。SQLite的優點是具有可移植性,它不需要服務器就能運行,同時,它也存在一些缺陷,首先,沒有提供簡單的數據庫創建方式,必須手工創建數據庫,其次,SQLite沒有面向對象接口,必須使用依賴于C語言代碼的API。相對于OC,這套API既不那么優雅,也更難使用。當相比于用文件進行存儲,還是更推薦使用SQLite進行數據存儲。


    下面來看下如何使用SQLite


    工程目錄如下:

    首先建立一個Single View Application工程,命名為SQLite3Test,然后打開ViewController.xib文件,布局如下,并設置三個UITextField的tag分別為1、2、3

    設置tag的地方在屬性選擇器中(xcode右邊)



    然后在ViewController.h文件中聲明如下:

    #import <UIKit/UIKit.h>
    @interface ViewController : UIViewController
    @property(copy,nonatomic) NSString *databaseFilePath;
    //這個方法定義的是當應用程序退到后臺時將執行的方法,按下home鍵執行(通知中心來調度)
    -(void)applicationWillResignActive:(NSNotification *)notification;
    //當通過鍵盤在UITextField中輸入完畢后,點擊屏幕空白區域關閉鍵盤的操作
    -(IBAction)backgroundTapped:(id)sender;
    @end

    接下來看下.m文件的具體實現,就不一一介紹了,在代碼中會有注釋

    在開始寫代碼前,要導入SQLite支持包 libsqlite3.dylib(具體做法就不詳述了)

    上代碼:

    #import "ViewController.h"
    #import "sqlite3.h"
    //數據庫文件的名字
    #define kDatabaseName @"database.sqlite3"
    
    @interfaceViewController ()
    
    @end
    
    @implementation ViewController
    
    @synthesize databaseFilePath;
    
    - (void)viewDidLoad
    {
        [superviewDidLoad];
        
        NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentDirectory = [path objectAtIndex:0];
        //指定數據庫文件的路徑
        self.databaseFilePath = [documentDirectory stringByAppendingPathComponent:kDatabaseName];
        
        //打開數據庫
        sqlite3 *database;
        //[self.databaseFilePath UTF8String];將OC字符串裝換成C字符串
        if (sqlite3_open([self.databaseFilePathUTF8String], &database) != SQLITE_OK) {
            //關閉數據庫
            sqlite3_close(database);
            NSAssert(0,@"數據庫打開失敗");
        }
            
        //創建表格
        NSString *createSql = @"CREATE TABLE IF NOT EXISTS STUDENT (TAG INTEGER PRIMARY KEY ,FIELD_DATA TEXT);";
        //若發生錯誤,則錯誤信息存在該字符串中
        char *errorMsg;
        
        //sqlite3_exec這個方法可以執行那些沒有返回結果的操作,例如創建、插入、刪除等,這個函數包含了sqlite3_prepare這個函數的操作,目的是將UTF-8格式的SQL語句轉換為編譯后的語句
        if (sqlite3_exec(database, [createSql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
            sqlite3_close(database);
            NSAssert(0,@"創建表錯誤:%s", errorMsg);
        }
        
        //查詢數據庫
        NSString *querySql = @"SELECT * FROM STUDENT ORDER BY TAG";
        //語句句柄
        sqlite3_stmt *statament;
        //sqlite3_prepare_v2的作用是將UTF-8格式的SQL語句轉換為編譯后的語句,并返回指向該語句的指針
        if (sqlite3_prepare_v2(database, [querySql UTF8String], -1, &statament, nil) == SQLITE_OK) {
            //sqlite3_step的作用是在編譯后的語句中向前移動一條記錄,SQLITE_ROW代表一行
            while (sqlite3_step(statament) == SQLITE_ROW) {
                //返回當前這條記錄中的一個int類型字段的值,下面sqlite3_column_text返回一個字符串類型的值,后面的數字對應每一列
                int tag = sqlite3_column_int(statament, 1);
                char *rowData = (char *)sqlite3_column_text(statament, 2);
                //如果要得到一個NSString字符串,可以采用如下方法
                //NSString *str = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statament, 1)];
                
                //通過tag得到UI控件,類似Android中的findViewById(id)
                UITextField *textField = (UITextField *)[self.viewviewWithTag:tag];
                
                //[[NSString alloc]initWithUTF8String:rowData] 將C字符串轉換成OC字符串
                textField.text = [[NSStringalloc]initWithUTF8String:rowData];
            }
            //刪除編譯后的語句
            sqlite3_finalize(statament);
        }
        sqlite3_close(database);
        
        //注冊通知,當程序將要退到后臺時執行applicationWillResignActive方法(在.h中定義)
        UIApplication *application = [UIApplicationsharedApplication];
        [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotificationobject:application];
    }
    
    - (void)viewDidUnload
    {
        [superviewDidUnload];
        // Release any retained subviews of the main view.
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
    
    //按下Home鍵程序將要進入后臺前保存UITextField中的數據
    -(void)applicationWillResignActive:(NSNotification *)notification
    {
        sqlite3 *database;
        if (sqlite3_open([self.databaseFilePathUTF8String], &database) != SQLITE_OK) {
            NSAssert(0,@"打開數據庫錯誤");
            sqlite3_close(database);
        }
        
        for (int i = 1; i <= 3; i++) {
            UITextField *textField = (UITextField *)[self.viewviewWithTag:i];
            
            //插入數據
            char *update = "INSERT OR REPLACE INTO STUDENT VALUES (?,?)";
            sqlite3_stmt *statement;
            if (sqlite3_prepare_v2(database, update, -1, &statement, nil) == SQLITE_OK) {
                //將值保存到指定的列
                sqlite3_bind_int(statement, 1, i);
                
                //第四個參數代表第三個參數中需要傳遞的長度。對于C字符串來說,-1表示傳遞全部字符串。第五個參數是一個回調函數,比如執行后做內存清除工作。
                sqlite3_bind_text(statement, 2, [textField.textUTF8String], -1, NULL);
            }
            
            char *errorMsg = NULL;
            //SQLITE_DONE代表更新數據庫是否完成
            if (sqlite3_step(statement) != SQLITE_DONE) {
                NSAssert(0,@"更新數據出錯:%s",errorMsg);
            }
            sqlite3_finalize(statement);
        }
        
        sqlite3_close(database);
    }
    
    -(IBAction)backgroundTapped:(id)sender
    {
        /*當通過鍵盤在UITextField中輸入完畢后,點擊屏幕空白區域關閉鍵盤的操作
         設置步驟是打開.xib文件選中整個視圖,然后將屬性選擇器中的class由UIView改成UIControl,然后在事件選取器中選擇Touch Down事件并連線到.h文件中的backgroundTapped方法
         */
        for (int i = 1; i <= 3; i ++) {
            UITextField *textField = (UITextField *)[self.viewviewWithTag:i];
            [textField resignFirstResponder];
        }
    }
    
    @end

    最后運行效果如下,輸入信息后按下Home鍵,然后再進入應用,可以看到數據在每次退出前都保存了,再次進入則從sqlite數據庫查詢保存的數據并顯示在界面上



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

    智能推薦

    SQLite數據庫

    1.SQLite數據庫簡介 SQLite 是一個開源的、內嵌式的關系型數據庫,第一個版本誕生于 2000 年 5 月,目前最高版本為 SQLite3。 學習網站:http://www.runoob.com/sqlite/sqlite-tutorial.html 安裝方法:( 我用的是ubuntu12.04) 字符界面: 圖形界面: SQLite 特性: 零配置 、靈活、可移植、自由的授權、緊湊、可...

    SQLite數據庫

     Android下的Sqlite數據庫                     SQLite,是一款輕型的數據庫,它包含在一個相對小的C庫中。它的設計目標是嵌入式的,而 且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在...

    SQLite數據庫

    創建表格: CREATE TABLE Users(   id INTEGER blabla   name VARCHAR(128),   email VARCHAR(128) ) CREATE TABLE Course(   id INTEGER blabla, %主鍵   cname TEXT ) CREATE TABLE Member...

    SQLITE(數據庫)

    數據庫 簡介 數據庫(Database)按照數據結構來組織、存儲和管理數據的倉庫,目前市面上常有的數據庫有:SQL Server、Oracle、MySQL(小型數據庫)、DB2(大型數據庫)。 而我們的SQLITE它是一款非常輕量級別的關系數據庫系統,SQLite在使用前不需要安裝設置,不需要進程來啟動、停止或者配置。主要使用于手機應用的數據庫以及小型桌面軟件的數據庫。 SQLITE下載 下載地址...

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

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