C++ 将SQLite与WinRT结合使用

C++ 将SQLite与WinRT结合使用,c++,sqlite,porting,windows-runtime,microsoft-metro,C++,Sqlite,Porting,Windows Runtime,Microsoft Metro,我正在开发一个metro ui应用程序,我想将SQLite用于一些内部数据,而不是JET,以便利用一些已经编写的代码 但是,当我尝试使用sqlite3_open打开数据库时,它不起作用。我收到一个错误,说a无法打开数据库 我相信SQLite使用的一些API不能用于metro风格的应用程序 有人能帮我吗?至少告诉我如何识别应该移植哪些API?我没有在WinRT中尝试sqllite,但我认为它应该可以工作。最有可能的原因是您对试图打开的文件没有正确的权限。检查以确保可以使用fopen()之类的简单A

我正在开发一个metro ui应用程序,我想将SQLite用于一些内部数据,而不是JET,以便利用一些已经编写的代码

但是,当我尝试使用sqlite3_open打开数据库时,它不起作用。我收到一个错误,说a无法打开数据库

我相信SQLite使用的一些API不能用于metro风格的应用程序


有人能帮我吗?至少告诉我如何识别应该移植哪些API?

我没有在WinRT中尝试sqllite,但我认为它应该可以工作。最有可能的原因是您对试图打开的文件没有正确的权限。检查以确保可以使用fopen()之类的简单API打开该文件。如果失败,则是权限问题。你需要将你的数据库放在你的应用程序拥有自然权限的目录中。例如,它不能在用户的文档文件夹中。

尝试在本地文件夹中打开数据库。下面是一个有效的包装器:

这段代码应该有效:

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. : : 错误:此应用程序未通过支持的API检查。 此应用程序类型不支持kernel32.dll中的API CreateFileA。 此应用程序类型不支持kernel32.dll中的API CreateFileW。 此应用程序类型不支持kernel32.dll中的API DeleteFileA。 : : 尝试此选项(仅适用于UTF-8数据库文件名):


有关更多详细信息,请参阅。

刚刚发布了一个新的WinRT SQLite3变体,它与Windows应用商店指南兼容。请参阅

sqlite3\u open()
只有在无法创建要传递的文件时才会失败。您是否具有在您提供的位置在磁盘上创建文件的适当权限?有关详细信息,请查看windows事件日志。Hi steve中对此进行了详细描述,您是对的。这是一个权限问题,可以使用GetLastError看到。但是,我没有弄清楚如何解决许可问题。应用程序清单已完全配置为具有权限。即使在用户文档文件夹中,我也无法打开文件。它工作得很好。这些函数是编译的,即使没有在metro应用程序的API中列出。(他们列出了CreateFile2)请注意,除了编译之外,你还需要通过认证才能在Windows应用商店中发布应用程序,而使用这些API将无法通过认证。Dev Preview实际上附带了一个工具,您可以使用该工具自己运行测试,它还将向那些函数发出禁止使用的信号。从v3.7.13开始,SQLite本身现在与WinRT兼容。是的,最后。它没有WinRT组件,JS包装器/测试;)
int ret = Sqlite3.sqlite3_open_v2("qq.db", out db, 1, "");