SQLite仅适用于内存和备份

时间:2012-09-11 19:16:26

标签: c++ sqlite

所有这些在Windows上运行良好(完全相同的代码)。 OS X上没有那么多。我知道iOS和SQLite的其他问题,但这只是OS X 10.8和Xcode 4.4.1。

我有一个SQLite数据库,它可以很好地用于内存数据库,但不能在写入文件时使用。奇怪的是,我可以使用内存中的数据库并将其备份到文件中。

但等等,还有更多...

我可以在文件数据库上创建表格,当我查看它们时它们会正确显示。但是,当我尝试SELECT name FROM sqlite_master时,它什么都不返回。如果我尝试从表中插入或查询任何内容,我会得到一个表未找到错误。就好像它甚至无法找到它刚刚做的那样。

例如:

std::string filename = "test.db";
sqlite3* database = nullptr;
sqlite3_open(filename.c_str(), &database);
// ...
// Create tables...works
// Query from sqlite_master...broken

使用:memory:做同样的事情可以正常工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这个简单的C程序运行得很好。检查您可能采取的不同做法。

#include <stdio.h>
#include <assert.h>
#include <sqlite3.h>

int main(void)
{
    sqlite3 *db;
    sqlite3_stmt *stmt;
    int res;

    res = sqlite3_open("test.db", &db);
    assert(res == SQLITE_OK);

    res = sqlite3_exec(db, "create table if not exists tab(col)", NULL, NULL, NULL);
    assert(res == SQLITE_OK);
    res = sqlite3_exec(db, "insert into tab values('Hello, world!')", NULL, NULL, NULL);
    assert(res == SQLITE_OK);

    res = sqlite3_prepare_v2(db, "select * from tab", -1, &stmt, NULL);
    assert(res == SQLITE_OK);
    assert(sqlite3_column_count(stmt) >= 1);
    res = sqlite3_step(stmt);
    assert(res == SQLITE_ROW);
    printf("%s\n", sqlite3_column_text(stmt, 0));

    sqlite3_finalize(stmt);
    sqlite3_close(db);

    return 0;
}