2011-10-12 53 views
3

我正在開發一個metro ui應用程序,我想使用SQLite代替JET使用一些內部數據,以利用一些已經編寫的代碼。在WinRT中使用SQLite

Howerver當我嘗試使用sqlite3_open打開數據庫時,它不起作用。我收到一個錯誤,說無法打開數據庫。

我相信SQLite使用的一些API不能用於城域風格的應用程序。

有人可以幫助我嗎?至少說我如何確定apis應該移植到什麼地方?

+1

'sqlite3_open()'應該只會失敗,如果您無法創建通過它的文件。您是否有適當的權限在您提供的位置在磁盤上創建文件? – Chad

+0

檢查Windows事件日誌以獲取更多信息。 –

回答

3

此代碼應工作:

auto localAppDataParh = Windows::Storage::ApplicationData::Current->LocalFolder->Path; 
std::wstring path(localAppDataParh->Data()); 
path += L"\\sample.db"; 
sqlite3* db; 
int rc = sqlite3_open16(path.c_str(), &db); 

我相信SQLite的使用一些API不能在Metro風格的應用程序使用。

可能工作(至少在預覽發佈),但不允許。 Windows應用程序證書工具包說:

 
    Error: This application failed the supported API check. 
    API CreateFileA in kernel32.dll is not supported for this application type. 
    API CreateFileW in kernel32.dll is not supported for this application type. 
    API DeleteFileA in kernel32.dll is not supported for this application type. 
    : 
    : 
+0

它工作完美。即使沒有在Metro應用程序的API上列出,也會編譯此功能。 (他們列出了CreateFile2) –

+0

請注意,除了編譯之外,還需要通過應用程序的認證才能在Windows應用商店中發佈 - 並且使用這些API將會失敗該認證。 Dev Preview實際上提供了可以用來自己運行測試的工具,它也會將這些功能標示爲禁用。 –

0

我還沒有嘗試在WinRT中使用sqllite,但我認爲它應該可以工作。最有可能的選擇是您沒有對您要打開的文件的正確權限。檢查以確保您可以使用像fopen()這樣的簡單API打開文件。如果失敗了,那麼這是一個權限問題。您需要將您的數據庫放在您的應用程序擁有自然權限的目錄中。例如,它不能位於用戶的文檔文件夾中。

+1

這在http://lunarfrog.com/blog/2011/10/03/winrt-storage-overview/ – dalle

+0

中有所描述嗨史蒂夫,你是對的。這是一個權限問題,因爲它可以使用GetLastError進行查看。但是,我沒有弄清楚如何解決權限問題。應用程序清單配置好的權限。即使在用戶文檔文件夾中,我也無法打開文件。 –

1

試試這個(僅適用於UTF-8數據庫文件名):

int ret = Sqlite3.sqlite3_open_v2("qq.db", out db, 1, ""); 

詳情請參閱sqlite.org

1

剛剛發佈了一個新的WinRT SQLite3變體,它與Windows Store指南兼容。請參閱https://github.com/doo/SQLite3-WinRT

+0

從v3.7.13開始,SQLite本身現在是WinRT兼容的。 –

+0

是的,最後。它不帶有WinRT組件,JS包裝器/測試;) – philk