2013-07-26 76 views
0

我正在研究使用Sqlite存儲/檢索數據的嵌入式項目。由於'long long int'(64位)數據類型導致Sqlite數據庫在目標上失敗

SQLITE_INT64_TYPE定義爲long long int(默認定義)。

讀取數據庫架構時,根頁碼被錯誤解釋。

當模式被讀取時,表格的根頁碼被字序互換。例如,根頁碼''被讀爲''(0x0200000000)。

因爲這樣,給數據庫的任何其他SQL語句都不會返回任何結果。

目標描述:

  • 平臺:ARMv7的
  • 編譯器:GCC
  • 拱門型:小尾數

任何建議,如何解決這個問題?

謝謝

PS:現在確定根本原因後修改原始帖子。

#include "sqlite3.h" 


int sqlite3_port_exec_callback(void *data, int argc, char **argv, char **azColName){ 
  int i; 
  printf("%s: ", (const char*)data); 
  for(i=0; i<argc; i++){ 
     printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); 
  } 
  printf("\n"); 
  return 0; 
} 


int main(int argc, char **argv) 
{ 
    int rc, i, ncols; 
    sqlite3 *db; 
    sqlite3_stmt *stmt; 
    char *sql; 
    const char *tail; 
    char *look_aside_buf; 


    rc = sqlite3_open("USB1:\\foods.db", &db); 
    if(rc) { 
     printf("Can't open database: %s\n", sqlite3_errmsg(db)); 
     sqlite3_close(db); 
     exit(1); 
    } 



    const char* data = "Callback function called"; 
    char *zErrMsg = 0; 
    sql = "SELECT * from sqlite_master"; 


    /* Execute SQL statement */ 
    rc = sqlite3_exec(db, sql, &sqlite3_port_exec_callback, (void*)data, &zErrMsg); 
    if(rc != SQLITE_OK){ 
     printf("SQL error: %s\n", zErrMsg); 
     sqlite3_free(zErrMsg); 
    }else{ 
     printf("Operation done successfully\n"); 
    } 


    zErrMsg = 0; 
    /* Create SQL statement */ 
    sql = "SELECT * from episodes"; 


    /* Execute SQL statement */ 
    rc = sqlite3_exec(db, sql, &sqlite3_port_exec_callback, (void*)data, &zErrMsg); 
    if(rc != SQLITE_OK){ 
     printf("SQL error: %s\n", zErrMsg); 
     sqlite3_free(zErrMsg); 
    }else{ 
     printf("Operation done successfully\n"); 
    } 




    zErrMsg = 0; 
    /* Create SQL statement */ 
    sql = "SELECT count(*) from episodes"; 
    /* Execute SQL statement */ 
    rc = sqlite3_exec(db, sql, &sqlite3_port_exec_callback, (void*)data, &zErrMsg); 
    if(rc != SQLITE_OK){ 
     printf("SQL error: %s\n", zErrMsg); 
     sqlite3_free(zErrMsg); 
    }else{ 
     printf("Operation done successfully\n"); 
    } 


    sqlite3_close(db); 

    return 0; 
} 

輸出如下:

Callback function called: type = table 
name = episodes 
tbl_name = episodes 
rootpage = 8589934592 
sql = CREATE TABLE episodes (
    id integer primary key, 
    season int, 
    name text) 

Callback function called: type = table 
name = foods 
tbl_name = foods 
rootpage = 30064771072 
sql = CREATE TABLE foods(
    id integer primary key, 
    type_id integer, 
    name text) 

Callback function called: type = table 
name = foods_episodes 
tbl_name = foods_episodes 
rootpage = 77309411328 
sql = CREATE TABLE foods_episodes(
    food_id integer, 
    episode_id integer) 

Callback function called: type = table 
name = food_types 
tbl_name = food_types 
rootpage = 107374182400 
sql = CREATE TABLE food_types(
    id integer primary key, 
    name text) 

Operation done successfully 
Operation done successfully 
Callback function called: count(*) = 0 

Operation done successfully 
+1

兩側同一版本的sqlite?您是否將數據庫文件從PC複製到嵌入式設備,還是從嵌入式設備上重新創建它?你有沒有嘗試過一個更簡單的數據庫? –

+0

+您是直接從嵌入式系統的內存中讀取數據庫嗎? – user2553780

+0

我將數據庫的副本保存在可移動設備中供系統訪問。數據庫文件是在PC中創建的。 – Girish

回答

1

我找到了根本原因,並希望把這個線程結束。

這真是令人尷尬!在項目中有兩個'Sqlite.h'頭文件,每個對SQLITE_INT64_TYPE都有不同的配置。因此,輸出的差異。

非常感謝所有花時間在此工作的人。

相關問題