我正在启动一个新项目,该项目必须将数据从转换XML
为db
。XMLs
具有自己的格式,因此不能用于填充db
。
我选择使用sqlite
,因为它是一个嵌入式平台,并且我需要一个轻量级的库。
我正在努力与列类型。我写了下面的SQL:
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
static bool exec_sql (sqlite3 *db, char *sql, bool use_callback)
{
int rc;
char *zErrMsg = 0;
// Execute SQL statement
if (use_callback == true)
{
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
}
else
{
rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);
}
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL: %s FAIL!!!\nError: %s\n", sql, zErrMsg);
sqlite3_free(zErrMsg);
return false;
}
return true;
}
int main ( int argc, char *argv[] )
{
xmlDoc *doc;
xmlNode *root_element;
FILE *fw;
int i, srcidx, next_start;
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
rc = sqlite3_open("Configuration.db", &db);
if( rc )
{
XML2DB_DEBUG_ERR("Can't open database: %s\n", sqlite3_errmsg(db));
}
else
{
XML2DB_DEBUG_INFO("Opened database successfully\n");
}
sql = "CREATE TABLE Table2(" \
"ID INT NOT NULL PRIMARY KEY," \
"TABLE_1_ID INT FOREGN KEY REFERENCES Table1(ID) NOT NULL ," \
"COLUMN_1 INT[512] NOT NULL,"\
"COLUMN_2 TEXT NOT NULL,"\
"COLUMN_3 BOOLEAN DEFAULT FALSE);";
// Execute SQL statement
exec_sql(db, sql, false);
sql = "INSERT INTO Models (ID, TABLE_1_ID, COLUMN_1, COLUMN_2, COLUMN_3) "\
"VALUES (1, 1, '{1,2,3,4,5}', 'blabla', TRUE); ";
// Execute SQL statement
exec_sql(db, sql,true);
sql = "SELECT * FROM Table2;";
// Execute SQL statement
exec_sql(db, sql, true);
sqlite3_close(db);
return 0;
}
该代码运行良好, 但现在我发现sqlite3
它不支持boolean
和array
数据类型。
我写的,“效果很好”,因为一个SELECT
和DBVisualizer
可以显示数据并没有给我的错误。
因此,问题是:
SQLite使用动态类型。
要检查数据类型,请使用CHECK约束:
CREATE TABLE Table2(
ID INTEGER PRIMARY KEY,
TABLE_1_ID INT FOREIGN KEY REFERENCES Table1(ID) NOT NULL,
COLUMN_1 INT[512] NOT NULL
COLUMN_2 TEXT NOT NULL CHECK (typeof(COLUMN_2) = 'text'),
COLUMN_3 BOOLEAN DEFAULT 0 CHECK (COLUMN_3 IN (0, 1))
);
sqlite3pp 该库对SQLite3 API使用C++类进行包装,支持几乎所有SQLite3功能(打开数据库、查询、执行命令、事物等)。 示例代码如下: database 数据库 sqlite3pp::database db("test.db");db.execute("INSERT INTO contacts (name, phone) VALUES ('Mike', '555-1234')
go-sqlite3 是 Go 语言实现的 SQLite 数据库的驱动。
better-sqlite3 The fastest and simplest library for SQLite3 in Node.js. Full transaction support High performance, efficiency, and safety Easy-to-use synchronous API (better concurrency than an asynch
Qore SQLite3 Module 是 Qore 脚本语言用来连接 SQLite3 数据库的驱动程序。
问题内容: 我知道在oracle / mysql / sqlserver语句中,您不能在子句中引用列别名,因为它是在之前执行的,但它在sqlite3中有效: 为什么在sqlite中这有可能? 问题答案: 使用启用了标志的sqlite3 : 从上面的指令堆栈可以看出,行的循环(第8-23行)针对表中的每一行对子句中的每个表达式重复执行and命令。 因此,要回答我自己的问题,sqlite引擎能够通过在
9.4.1.2.使用 sqlite3 Android 附带了一个命令行工具sqlite3,供我们访问数据库。 要验证数据库原型是否正确,你需要: 打开终端或者命令提示符。 输入adb shell,连接到仿真器或者真机。 切换到数据库所在的目录:cd/data/data/com.marakana.yamba/databases/。 通过sqlite3timeline.db打开数据库。 打开数据库之后