2012-09-11 69 views
0

所有這些在Windows(完全相同的代碼)上效果很好。與OS X無關。我知道iOS和SQLite的其他問題,但這僅僅是OS X 10.8和Xcode 4.4.1。SQLite僅適用於內存和備份

我已經有了一個SQLite數據庫,它可以在內存數據庫中正常工作,但在寫入文件時不會有效。奇怪的是,我可以把內存數據庫和備份到一個文件就好了。

別急,還有更精彩的......

我可以在文件DB創建表和它們顯示正確時,我認爲他們。但是,當我嘗試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:工作正常不過。

任何想法?

+0

您的'sqlite3_open'調用看起來是正確的。然而,我無法對你的代碼進行任何說明... –

+0

我在OSX上使用SQLite時沒有發生意外,但沒有從C++或Obj-C(我的應用程序使用不同的語言,所以我沒有嘗試過) 。我猜這個問題不是SQLite本身或OSX ... –

+0

你聲明'數據庫',但是你把'&_database'傳遞給'sqlite3_open()'。請複製並粘貼精確的代碼,以便我們不必猜測您向我們展示的代碼與您使用的代碼有何不同。 –

回答

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; 
} 
相關問題