0

所有这些在 Windows 上都很好用(完全相同的代码)。在 OS X 上没有那么多。我知道 iOS 和 SQLite 的其他问题,但这仅适用于 OS X 10.8 和 Xcode 4.4.1。

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

但是等等,还有更多...

我可以在文件数据库上创建表,当我查看它们时它们会正确显示。但是,当我尝试 a 时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:效果很好。

有任何想法吗?

4

1 回答 1

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;
}
于 2012-09-11T19:50:22.107 回答