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
兩側同一版本的sqlite?您是否將數據庫文件從PC複製到嵌入式設備,還是從嵌入式設備上重新創建它?你有沒有嘗試過一個更簡單的數據庫? –
+您是直接從嵌入式系統的內存中讀取數據庫嗎? – user2553780
我將數據庫的副本保存在可移動設備中供系統訪問。數據庫文件是在PC中創建的。 – Girish