你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS開發(94)之SQLite數據庫

IOS開發(94)之SQLite數據庫

編輯:IOS開發綜合

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文件中聲明如下:


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

 

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

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

上代碼:


[cpp]
#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數據庫查詢保存的數據並顯示在界面上

 

\

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved