學習iPhone開發中 sqlite3的使用

因爲我主要負責咱們小組項目數據庫模塊的部分因此這幾天都一直在研究在iphone中最爲經常使用的一個簡單數據庫sqlite,本身也蒐集不少資料,所以在這裏總結一下這幾天的學習成果:
  •      1.Sqlite操做簡明教程:http://hlee.javaeye.com/blog/359962
  •      2.iphone訪問本地數據庫sqlite3:http://blog.csdn.net/LuWei103/archive/2009/08/08/4425045.aspx
  •      3.iphone開發-SQLite數據庫使用:http://yuxiang13115204.blog.163.com/blog/static/26802022200921410845642/
     感謝以上文章做者能讓我這個初學者可以快速的學習關於iphone開發中sqlite的使用,詳細文章:
sqlite操做簡明教程
     
SQLite顧名思議是以 SQL爲基礎的數據庫軟件,SQL是一套強大的數據庫語言,主要概念是由「數據庫」、「資料表」(table)、「查詢指令」(queries)等單元組 成的「關聯性數據庫」(進一步的概念可參考網絡上各類關於SQL及關聯性數據庫的文件)。由於SQL的查詢功能強大,語法一致而入門容易,所以成爲現今主 流數據庫的標準語言(微軟、Oracle等大廠的數據庫軟件都提供SQL語法的查詢及操做)。 

     如下咱們就創建數據庫、創建資料表及索引、新增資料、查詢資料、更改資料、移除資料、sqlite3命令列選項等幾個項目作簡單的介紹。 

目錄 


  •      1 創建數據庫檔案
  •      2 在sqlite3提示列下操做
  •      3 SQL的指令格式
  •      4 創建資料表
  •      5 創建索引
  •      6 加入一筆資料
  •      7 查詢資料
  •      8 如何更改或刪除資料
  •      9 其餘sqlite的特別用法
  •      10 小結


列表 
 
創建數據庫檔案 

用sqlite3創建數據庫的方法很簡單,只要在shell下鍵入(如下$符號爲shell提示號,請勿鍵入): 

Sql代碼 
  1. $ sqlite3 foo.db  


若是目錄下沒有foo.db,sqlite3就會創建這個數據庫。sqlite3並無強制數據庫檔名要怎麼取,所以若是你喜歡,也能夠取個例如foo.icannameitwhateverilike的檔名。 

在sqlite3提示列下操做 

進入了sqlite3以後,會看到如下文字: 

SQLite version 3.1.3Enter ".help" for instructionssqlite> 

這時若是使用.help能夠取得求助,.quit則是離開(請注意:不是quit) 

SQL的指令格式 

因此的SQL指令都是以分號(;)結尾的。若是遇到兩個減號(--)則表明註解,sqlite3會略過去。 

創建資料表 

假設咱們要建一個名叫film的資料表,只要鍵入如下指令就能夠了: 

Sql代碼 
  1. create table film(title, length, year, starring);  


這樣咱們就創建了一個名叫film的資料表,裏面有name、length、year、starring四個字段。 

這個create table指令的語法爲: 
Sql代碼 
  1. create table table_name(field1, field2, field3, ...);  


table_name是資料表的名稱,fieldx則是字段的名字。sqlite3與許多SQL數據庫軟件不一樣的是,它不在意字段屬於哪種資料型態:sqlite3的字段能夠儲存任何東西:文字、數字、大量文字(blub),它會在適時自動轉換。 

創建索引 

若是資料表有至關多的資料,咱們便會創建索引來加快速度。比如說: 

Sql代碼 
  1. create index film_title_index on film(title);  


意思是針對film資料表的name字段,創建一個名叫film_name_index的索引。這個指令的語法爲 

Sql代碼 
  1. create index index_name on table_name(field_to_be_indexed);  


一旦創建了索引,sqlite3會在針對該字段做查詢時,自動使用該索引。這一切的操做都是在幕後自動發生的,無須使用者特別指令。 

加入一筆資料 

接下來咱們要加入資料了,加入的方法爲使用insert into指令,語法爲: 
Sql代碼 
  1. insert into table_name values(data1, data2, data3, ...);  


例如咱們能夠加入 

Sql代碼 
  1. insert into film values ('Silence of the Lambs, The', 118, 1991, 'Jodie Foster');insert into film values ('Contact', 153, 1997, 'Jodie Foster');insert into film values ('Crouching Tiger, Hidden Dragon', 120, 2000, 'Yun-Fat Chow');insert into film values ('Hours, The', 114, 2002, 'Nicole Kidman');  


若是該字段沒有資料,咱們能夠填NULL。 

查詢資料 

講到這裏,咱們終於要開始介紹SQL最強大的select指令了。咱們首先簡單介紹select的基本句型: 

Sql代碼 
  1. select columns from table_name where expression;  


最多見的用法,固然是倒出全部數據庫的內容: 

Sql代碼 
  1. select * from film;  


若是資料太多了,咱們或許會想限制筆數: 

Sql代碼 
  1. select * from film limit 10;  


或是照着電影年份來排列: 

Sql代碼 
  1. select * from film order by year limit 10;  


或是年份比較近的電影先列出來: 

Sql代碼 
  1. select * from film order by year desc limit 10;  


或是咱們只想看電影名稱跟年份: 

Sql代碼 
  1. select title, year from film order by year desc limit 10;  


查全部茱蒂佛斯特演過的電影: 

Sql代碼 
  1. select * from film where starring='Jodie Foster';  


查全部演員名字開頭叫茱蒂的電影('%' 符號即是 SQL 的萬用字符): 

Sql代碼 
  1. select * from film where starring like 'Jodie%';  


查全部演員名字以茱蒂開頭、年份晚於1985年、年份晚的優先列出、最多十筆,只列出電影名稱和年份: 

Sql代碼 
  1. select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10;  


有時候咱們只想知道數據庫一共有多少筆資料: 

Sql代碼 
  1. select count(*) from film;  


有時候咱們只想知道1985年之後的電影有幾部: 

Sql代碼 
  1. select count(*) from film where year >= 1985;  


(進一步的各類組合,要去看SQL專書,不過你大概已經知道SQL爲何這麼流行了:這種語言容許你將各類查詢條件組合在一塊兒──而咱們還沒提到「跨數據庫的聯合查詢」呢!) 

如何更改或刪除資料 

瞭解select的用法很是重要,由於要在sqlite更改或刪除一筆資料,也是靠一樣的語法。 

例若有一筆資料的名字打錯了: 
Sql代碼 
  1. update film set starring='Jodie Foster' where starring='Jodee Foster';  


就會把主角字段裏,被打成'Jodee Foster'的那筆(或多筆)資料,改回成Jodie Foster。 
Sql代碼 
  1. delete from film where year < 1970;  


就會刪除全部年代早於1970年(不含)的電影了。 

其餘sqlite的特別用法 

sqlite能夠在shell底下直接執行命令: 
Sql代碼 
  1. sqlite3 film.db "select * from film;"  


輸出 HTML 表格: 

Sql代碼 
  1. sqlite3 -html film.db "select * from film;"  


將數據庫「倒出來」: 

Sql代碼 
  1. sqlite3 film.db ".dump" > output.sql  


利用輸出的資料,創建一個如出一轍的數據庫(加上以上指令,就是標準的SQL數據庫備份了): 

Sql代碼 
  1. sqlite3 film.db < output.sql  


在大量插入資料時,你可能會須要先打這個指令: 

begin; 

插入完資料後要記得打這個指令,資料纔會寫進數據庫中: 

commit; 

小結 

      以上咱們介紹了SQLite這套數據庫系統的用法。事實上OS X也有諸於SQLiteManagerX這類的圖形接口程序,能夠便利數據庫的操做。不過萬變不離其宗,瞭解SQL指令操做,SQLite與其各家變種就很容易上手了。 

        至於爲何要寫這篇教學呢?除了由於OS X Tiger大量使用SQLite以外(例如:Safari的RSS reader,就是把文章存在SQLite數據庫裏!你能夠開開看~/Library/Syndication/Database3這個檔案,看看裏面有 什麼料),OpenVanilla從0.7.2開始,也引進了以SQLite爲基礎的詞彙管理工具,以及全字庫的註音輸入法。由於使用SQLite,這兩 個模塊無論數據庫內有多少筆資料,均可以作到「瞬間啓動」以及至關快速的查詢迴應。 

       將一套方便好用的數據庫軟件包進OS X中,固然也算是Apple至關至關聰明的選擇。再勤勞一點的朋友也許已經開始想拿SQLite來記錄各類東西(像咱們其中就有一人寫了個程序,自動記錄 電池狀態,寫進SQLite數據庫中再作統計......)了。想像空間可說至關寬廣。 

        目前支援SQLite的程序語言,你能想到的大概都有了。這套數據庫2005年還贏得了美國O'Reilly Open Source Conference的最佳開放源代碼軟件獎,獎評是「有什麼東西能讓Perl, Python, PHP, Ruby語言團結一致地支援的?就是SQLite」。因而可知SQLite的地位了。而SQLite程序很是小,更是少數打 "gcc -o sqlite3 *",不需任何特殊設定就能跨平臺編譯的程序。小而省,小而美,SQLite連網站都很少贅言,直指SQL語法精要及API使用方法,原做者大概也能夠算 是某種程序設計之道(Tao of Programming)裏所說的至人了。 

iphone開發-SQLite數據庫使用


我如今要使用SQLite3.0建立一個數據庫,而後在數據庫中建立一個表格。
首先要引入SQLite3.0的lib庫。而後包含頭文件#import <sqlite3.h>
【1】 打開數據庫,若是沒有,那麼建立一個
sqlite3* database_;
-(BOOL) open{
       NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mydb.sql"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL find = [fileManager fileExistsAtPath:path];
    //找到數據庫文件mydb.sql
    if (find) {
        NSLog(@"Database file have already existed.");
        if(sqlite3_open([path UTF8String], &database_) != SQLITE_OK) {
            sqlite3_close(database_);
            NSLog(@"Error: open database file.");
            return NO;
        }
        return YES;
    }
    if(sqlite3_open([path UTF8String], &database_) == SQLITE_OK) {
        bFirstCreate_ = YES;
        [self  createChannelsTable:database_];//在後面實現函數 createChannelsTable
        return YES;
    } else {
        sqlite3_close(database_);
        NSLog(@"Error: open database file.");
        return NO;
    }
    return NO;
}
【2】建立表格
//建立表格,假設有五個字段,(id,cid,title,imageData ,imageLen )
//說明一下,id爲表格的主鍵,必須有。
//cid,和title都是字符串,imageData是二進制數據,imageLen 是該二進制數據的長度。
- (BOOL) createChannelsTable:(sqlite3*)db{
    char *sql = "CREATE TABLE channels (id integer primary key, \
                                        cid text, \
                                        title text, \
                                        imageData BLOB, \
                                        imageLen integer)";
    sqlite3_stmt *statement;
    if(sqlite3_prepare_v2(db, sql, -1, &statement, nil) != SQLITE_OK) {
        NSLog(@"Error: failed to prepare statement:create channels table");
        return NO;
    }
    int success = sqlite3_step(statement);
    sqlite3_finalize(statement);
    if ( success != SQLITE_DONE) {
        NSLog(@"Error: failed to dehydrate:CREATE TABLE channels");
        return NO;
    }
    NSLog(@"Create table 'channels' successed.");
    return YES;
}
 
【3】 向表格中插入一條記錄
假設channle是一個數據結構體,保存了一條記錄的內容。
- (BOOL) insertOneChannel:(Channel*)channel{
    NSData* ImageData = UIImagePNGRepresentation( channel.image_);
    NSInteger Imagelen = [ImageData length];
    sqlite3_stmt *statement;
    static char *sql = "INSERT INTO channels (cid,title,imageData,imageLen)\
                        VALUES(?,?,?,?)";
    //問號的個數要和(cid,title,imageData,imageLen)裏面字段的個數匹配,表明未知的值,將在下面將值和字段關聯。
    int success = sqlite3_prepare_v2(database_, sql, -1, &statement, NULL);
    if (success != SQLITE_OK) {
        NSLog(@"Error: failed to insert:channels");
        return NO;
    }
   
   //這裏的數字1,2,3,4表明第幾個問號
    sqlite3_bind_text(statement, 1, [channel.id_ UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(statement, 2, [channel.title_ UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_blob(statement, 3, [ImageData bytes], Imagelen, SQLITE_TRANSIENT);
    sqlite3_bind_int(statement, 4, Imagelen);    

    success = sqlite3_step(statement);
    sqlite3_finalize(statement);
    
    if (success == SQLITE_ERROR) {
        NSLog(@"Error: failed to insert into the database with message.");
        return NO;
    } 
 
  NSLog(@"Insert One Channel#############:id =  %@",channel.id_);
    return YES;
}
 
【4】數據庫查詢
這裏獲取表格中全部的記錄,放到數組fChannels中。
- (void) getChannels:(NSMutableArray*)fChannels{
    sqlite3_stmt *statement = nil;
    char *sql = "SELECT * FROM channels";
    if (sqlite3_prepare_v2(database_, sql, -1, &statement, NULL) != SQLITE_OK) {
        NSLog(@"Error: failed to prepare statement with message:get channels.");
    }
    //查詢結果集中一條一條的遍歷全部的記錄,這裏的數字對應的是列值。
    while (sqlite3_step(statement) == SQLITE_ROW) {
        char* cid       = (char*)sqlite3_column_text(statement, 1);
        char* title     = (char*)sqlite3_column_text(statement, 2);
        Byte* imageData = (Byte*)sqlite3_column_blob(statement, 3);
        int imageLen    = sqlite3_column_int(statement, 4);        
        Channel* channel = [[Channel alloc] init];
        if(cid)
            channel.id_ = [NSString stringWithUTF8String:cid];
        if(title)
            channel.title_ = [NSString stringWithUTF8String:title];
        if(imageData){
            UIImage* image = [UIImage imageWithData:[NSData dataWithBytes:imageData length:imageLen]];
            channel.image_ = image;
        }
         [fChannels addObject:channel];
        [channel release];
    }
    sqlite3_finalize(statement);
}
 iphone訪問本地數據庫sqlite3

Phone也支持訪問本地數據庫Sqlite 3。這裏簡單的介紹一下iPhoneSqlite 3的使用方法。

首先須要在項目中引用 Sqlite 3的開發包,下面是在iPhone SDK 3.0下的目錄:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/libsqlite3.0.dylib
到這裏你須要事先用命令來建立 Sqlite 3的數據庫文件,並在其中建立本身的表等等,而後做爲資源文件添加到項目,而後在程序第一次運行的時候複製到程序下的Documents或其餘目錄下,關於 Sqlite 3的基本操做網上已經有很多文章,這裏就不重複了。
在iPhone中使用 Sqlite 3主要步驟以下:
1 首先獲取iPhone上 Sqlite 3的數據庫文件的地址
2 打開 Sqlite 3的數據庫文件
3 定義SQL文
4 邦定執行SQL所須要的參數
5 執行SQL文,並獲取結果
6 釋放資源
7 關閉 Sqlite 3數據庫。
下面結合代碼來示範一下。
  1. // 首先獲取iPhone上Sqlite3的數據庫文件的地址  
  2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  3. NSString *documentsDirectory = [paths objectAtIndex:0];  
  4. NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];  
  5. // 打開Sqlite3的數據庫文件  
  6. sqlite3 *database;  
  7. sqlite3_open([path UTF8String], &database);  
  8. // 定義SQL文  
  9. sqlite3_stmt *stmt;  
  10. const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";  
  11. sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);  
  12. // 邦定第一個int參數  
  13. sqlite3_bind_int(stmt, 1, 1);  
  14. // 邦定第二個字符串參數  
  15. sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);  
  16. // 執行SQL文,並獲取結果  
  17. sqlite3_step(stmt);  
  18. // 釋放資源  
  19. sqlite3_finalize(stmt);  
  20. // 關閉Sqlite3數據庫  
  21. sqlite3_close(database);  
 
這裏只是粗略的給你們介紹了一下,更詳細的資料請參考Apple的官方文檔。
相關文章
相關標籤/搜索