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