2011-10-12 46 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