2013-07-26 74 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都有不同的配置。因此,输出的差异。

非常感谢所有花时间在此工作的人。

相关问题