1. 程式人生 > >資料庫sqlite3.7.3 在PC端 和開發板arm的安裝及編譯

資料庫sqlite3.7.3 在PC端 和開發板arm的安裝及編譯

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

//sqlite3的回撥函式        
//sqlite 每查到一條記錄,就呼叫一次這個回撥
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
    //para是你在 sqlite3_exec 裡傳入的 void * 引數
    //通過para引數,你可以傳入一些特殊的指標(比如類指標、結構指標),然後在這裡面強制轉換成對應的型別(這裡面是void*型別,必須強制轉換成你的型別才可用)。然後操作這些資料
    //n_column是這一條記錄有多少個欄位 (即這條記錄有多少列)
    // char ** column_value 是個關鍵值,查出來的資料都儲存在這裡,它實際上是個1維陣列(不要以為是2維陣列),每一個元素都是一個 char * 值,是一個欄位內容(用字串來表示,以\0結尾)
    //char ** column_name 跟 column_value是對應的,表示這個欄位的欄位名稱
    //這裡,我不使用 para 引數。忽略它的存在.
    int i;
    printf( "記錄包含 %d 個欄位\n", n_column );
    for( i = 0 ; i < n_column; i ++ ){
         printf( "欄位名:%s  ß> 欄位值:%s\n",  column_name[i], column_value[i] );
    }
    printf( "------------------\n");        
    return 0;
}

int main( int argc, char **argv)
{
    sqlite3 * db;
    int result;
    char * errmsg = NULL;
    char **dbResult; //是 char ** 型別,兩個*號

    int nRow, nColumn;
    int i , j;
    int index;

    result = sqlite3_open( "mydb.db", &db );
    if( result != SQLITE_OK ){
         //資料庫開啟失敗
        return -1;
    }
    
    //建立一個測試表,表名叫 MyTable_1,有2個欄位: ID 和 name。其中ID是一個自動增加的型別,以後insert時可以不去指定這個欄位,它會自己從0開始增加
    result = sqlite3_exec( db, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) )", NULL, NULL, &errmsg );
    if(result != SQLITE_OK ){
         printf( "建立表失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
    }

    //插入一些記錄
    result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '走路' )", 0, 0, &errmsg );
    if(result != SQLITE_OK ){
        printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
    }
    result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '騎單車' )", 0, 0, &errmsg );
    if(result != SQLITE_OK ){
        printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
    }
    result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '坐汽車' )", 0, 0, &errmsg );
    if(result != SQLITE_OK ){
        printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
    }

    //開始查詢資料庫
    result = sqlite3_exec( db, "select * from MyTable_1", LoadMyInfo, NULL, &errmsg );

    //開始查詢,傳入的 dbResult 已經是 char **,這裡又加了一個 & 取地址符,傳遞進去的就成了 char ***
    result = sqlite3_get_table( db, "select * from MyTable_1", &dbResult, &nRow, &nColumn, &errmsg );
    if( SQLITE_OK == result ){
           //查詢成功
        index = nColumn; //前面說過 dbResult 前面第一行資料是欄位名稱,從 nColumn 索引開始才是真正的資料
        printf( "查到%d條記錄\n", nRow );
        for(  i = 0; i < nRow ; i++ ){
            printf( "第 %d 條記錄\n", i+1 );
            for( j = 0 ; j < nColumn; j++ )    {
                 printf( "欄位名:%s  ß> 欄位值:%s\n",  dbResult[j], dbResult [index] );
                ++index;
               // dbResult 的欄位值是連續的,從第0索引到第 nColumn - 1索引都是欄位名稱,從第 nColumn 索引開始,後面都是欄位值,它把一個二維的表(傳統的行列表示法)用一個扁平的形式來表示
             }
             printf( "-------\n" );
        }
    }
    //到這裡,不論資料庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放
    sqlite3_free_table( dbResult );

    //關閉資料庫
    sqlite3_close( db );

    return 0;
}