我正在开发一个 Metro ui 应用程序,我想将 SQLite 用于一些内部数据而不是 JET,以便利用一些已经编写的代码。
但是,当我尝试使用 sqlite3_open 打开数据库时,它不起作用。我收到一条错误消息,说无法打开数据库。
我相信 SQLite 使用的某些 API 不能用于 Metro 风格的应用程序。
有人可以帮我吗?至少告诉我如何确定应该移植哪些 api?
我正在开发一个 Metro ui 应用程序,我想将 SQLite 用于一些内部数据而不是 JET,以便利用一些已经编写的代码。
但是,当我尝试使用 sqlite3_open 打开数据库时,它不起作用。我收到一条错误消息,说无法打开数据库。
我相信 SQLite 使用的某些 API 不能用于 Metro 风格的应用程序。
有人可以帮我吗?至少告诉我如何确定应该移植哪些 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 应用程序证书工具包 说:
错误:此应用程序未通过支持的 API 检查。 此应用程序类型不支持 kernel32.dll 中的 API CreateFileA。 此应用程序类型不支持 kernel32.dll 中的 API CreateFileW。 此应用程序类型不支持 kernel32.dll 中的 API DeleteFileA。 : :
尝试在本地文件夹中打开数据库。这是一个有效的包装器:http ://sqlwinrt.codeplex.com/
试试这个(仅适用于 UTF-8 数据库文件名):
int ret = Sqlite3.sqlite3_open_v2("qq.db", out db, 1, "");
有关更多详细信息,请参见sqlite.org。
刚刚发布了一个新的 WinRT SQLite3 变体,它与 Windows 应用商店指南兼容。见https://github.com/doo/SQLite3-WinRT
我没有在 WinRT 中尝试过 sqllite,但我认为它应该可以工作。最有可能的原因是您对尝试打开的文件没有正确的权限。检查以确保您可以使用 fopen() 之类的简单 API 打开文件。如果失败,那就是权限问题。您需要将数据库放在您的应用程序拥有自然权限的目录中。例如,它不能在用户的文档文件夹中。