sqlite3

1、在Firefox中打開sqlite3(若是沒有,選擇工具->附加組件,添加便可)新建sqlite3數據庫,Contacts,sql

創建一個members表,字段 id,integer,主鍵,自增;name,varchar;email,varchar,null;birthday,datetime,null。數據庫

向表中添加一些數據:函數

 

 

 2、新建Empty Appliation,添加一個HomeViewController,和一個組件libsqlite3.dylib,來支持對sqlite3的鏈接,關閉,增刪改查等操做。工具

1. HomeViewController.h代碼:spa

#import <UIKit/UIKit.h>
#import "sqlite3.h"
 
@interface HomeViewController : UIViewController{
 
    sqlite3 *db; //聲明一個sqlite3數據庫
}
 
- (NSString *)filePath;//數據庫文件的路徑。通常在沙箱的Documents裏邊操做
 
@end
 

 

2. HomeViewController.m代碼: 操作系統

 #import "HomeViewController.h"orm

 
 
@interface HomeViewController ()
 
@end
 
@implementation HomeViewController
 

//該方法用於返回數據庫在Documents文件夾中的全路徑信息 sqlite

- (NSString *)filePath{
 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"Contacts.sqlite"];
}
 

//打開數據庫的方法 blog

- (void)openDB{
 
    if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(0, @"數據庫打開失敗。");
    }
}
 
//插入數據方法
- (void)insertRecordIntoTableName:(NSString *)tableName
                       withField1:(NSString *)field1 field1Value:(NSString *)field1Value
                        andField2:(NSString *)field2 field2Value:(NSString *)field2Value
                        andField3:(NSString *)field3 field3Value:(NSString *)field3Value{
/*方法1:經典方法
    NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES('%@', '%@', '%@')", tableName, field1, field2, field3, field1Value, field2Value, field3Value];
    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(0, @"插入數據錯誤!");
    }
    */

   //方法2:變量的綁定方法 內存

    NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",tableName, field1, field2, field3];
    
    sqlite3_stmt *statement;
    
    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
        sqlite3_bind_text(statement, 1, [field1Value UTF8String], -1,NULL);
        sqlite3_bind_text(statement, 2, [field2Value UTF8String], -1,NULL);
        sqlite3_bind_text(statement, 3, [field3Value UTF8String], -1,NULL);
    }
    if (sqlite3_step(statement) != SQLITE_DONE) {
        NSAssert(0, @"插入數據失敗!");
        sqlite3_finalize(statement);
    }
 
                                
}

 

//查詢數據
- (void)getAllContacts{
 
    NSString *sql = @"SELECT * FROM members";
    sqlite3_stmt *statement;
    
    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            
            char *name = (char *)sqlite3_column_text(statement, 0);
            NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
            
            char *email = (char *)sqlite3_column_text(statement, 1);
            NSString *emailStr = [[NSString alloc] initWithUTF8String:email];
            
            char *birthday = (char *)sqlite3_column_text(statement, 2);
            NSString *birthdayStr = [[NSString alloc] initWithUTF8String:birthday];
            
            NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",
                              nameStr, emailStr, birthdayStr];
            
            NSLog(info);
            
            [nameStr release];
            [emailStr release];
            [birthdayStr release];
            [info release];
        }
        sqlite3_finalize(statement);
    }
}
 
- (void)viewDidLoad
{
    [self openDB];
   
    [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李1" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
    
    [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李2" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
    
    [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李3" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
    
    
    
    [self getAllContacts];
    
    sqlite3_close(db);
    
    [super viewDidLoad];
}
 
@end
 

插入數據後的效果:

 

查詢的效果:

 

 

3、小結:

  1.數據查詢:sqlite3_exec()函數執行sql語句,在沒有返回值的狀況下(好比建立表格、插入記錄、刪除記錄等操做中)很好用。

                 也會用到sqlite3_stat結構、sqlite3_prepare_v2()函數、sqlte3_step()函數和sqlite3_finalize()函數。

       查詢分三個階段:準備階段:sqlite3_stat、sqlite3_prepare_v2() 

       執行階段:sqlte3_step() 

     終止階段: sqlite3_finalize() 

 2.附表:

 

sqlite3數據庫打開時的返回值及其所表明的含義

返回值

描述

返回值

描述

SQLITE_OK=0

返回成功

SQLITE_FULL=13

數據庫滿,插入失敗

SQLITE_ERROR=1

Sql錯誤或錯誤的數據庫

SQLITE_CANTOPEN=14

不能打開數據庫文件

SQLITE_INTERNAL=2

Sqlite的內部邏輯錯誤

SQLITE_PROTOCOL=15

數據庫鎖定協議錯誤

SQLITE_PERM=3

拒絕訪問

SQLITE_EMPTY=16

數據庫表爲空

SQLITE_ABORT=4

回調函數請求中斷

SQLITE_SCHEMA=17

數據庫模式改變

SQLITE_BUSY=5

數據庫文件被鎖

SQLITE_TOOBIG=18

一個表數據行過多

SQLITE_LOCKED=6

數據庫中的一個表被鎖

SQLITE_CONSTRAINT=19

因爲約束衝突而停止

SQLITE_NOMEN=7

內存分配失敗

SQLITE_MISMATCH=20

數據類型不匹配

SQLITE_READONLY=8

試圖對一個只讀數據庫進行寫操做

SQLITE_MISUSE=21

數據庫錯誤使用

SQLITE_INTERRUPT=9

由sqlite_interrupt()結束操做

SQLITE_NOLFS=22

使用主機操做系統不支持的特性

SQLITE_IOERR=10

磁盤I/O發生錯誤

SQLITE_AUTH=23

非法受權

SQLITE_CORRUPT=11

數據庫磁盤鏡像畸形

SQLITE_FORMAT=24

輔助數據庫格式錯誤

SQLITE_NOTFOUND=12

(Internal Only)表或記錄不存在

SQLITE_NOTADB=26

打開的不是一個數據庫文件

相關文章
相關標籤/搜索