如何在 Windows Phone 8.1 Silverlight 应用程序和 WinRT 运行时组件中使用 SQLite
How to use SQLite in both Windows Phone 8.1 Silverlight Application and WinRT Runtime Component
我有一个 Windows Phone Silverlight 8.1 应用程序,我想使用 Windows 运行时组件作为后台任务。在这两个项目中,我都想使用 SQLite 来访问应用程序数据库。
我在这里发现了一个类似的问题:
How to use SQLite in Windows (Phone) 8.1's BackgroundTask
这几乎涵盖了所有情况,但还不完全是。关于如何实现我的要求有什么想法吗?
我可以得到非常"close",我在编译阶段得到的最新错误信息如下:
Payload contains two or more files with the same destination path 'sqlite3.pdb'. Source files:
C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\ExtensionSDKs\SQLite.WP80.8.11.1\Redist\Debug\ARM\sqlite3.pdb
C:\Program Files (x86)\Microsoft SDKs\WindowsPhoneApp\v8.1\ExtensionSDKs\SQLite.WP81.8.11.1\Redist\Debug\ARM\sqlite3.pdb
我看到解决此类其他错误的方法是简单地将其中一个引用的 Copy Local 设置为 false,但我不明白在这种情况下这怎么可能,因为两者实际上都是必填。
提前致谢!
更新 1:
使用下面 scottisafool 的建议,我从 SQLite SDK 文件夹中删除了 pdb 文件,这让我更进一步,即它至少现在可以编译。但是,后来我运行陷入了另一个问题...
然后我开始在后台任务中删除用于访问数据库的代码,在使用 "not a valid WinRT Type" 跳过一些步骤后,我现在已经编译好了,看起来应该可以工作。但是,当我然后尝试 运行 应用程序和 运行 之前运行良好的代码时,即在应用程序首次加载时创建数据库,我 运行 进入此错误:
The specified module could not be found. (Exception from HRESULT: 0x8007007E)
具有以下堆栈跟踪:
at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
at Sqlite.Sqlite3.sqlite3_open_v2(String filename, Database& db, Int32 flags, String zVfs)
at SQLite.Net.Platform.WindowsPhone8.SQLiteApiWP8.Open(Byte[] filename, IDbHandle& db, Int32 flags, IntPtr zVfs)
at SQLite.Net.SQLiteConnection..ctor(ISQLitePlatform sqlitePlatform, String databasePath, SQLiteOpenFlags openFlags, Boolean storeDateTimeAsTicks, IBlobSerializer serializer, IDictionary`2 tableMappings, IDictionary`2 extraTypeMappings, IContractResolver resolver)
at SQLite.Net.SQLiteConnection..ctor(ISQLitePlatform sqlitePlatform, String databasePath, Boolean storeDateTimeAsTicks, IBlobSerializer serializer, IDictionary`2 tableMappings, IDictionary`2 extraTypeMappings, IContractResolver resolver)
at DatabaseContext.OnCreate(String databaseFilePath)
更新 2:
上面的错误消息 ONLY 一旦我添加对我的 Windows Phone 8.1 Portable Class 库(包含所有 SQLite 代码)的引用就会发生BackgroundTask Windows 运行时组件项目。必须在这一点上:
- 用于 Windows Phone 8.1
的 SQLite
- 用于 Windows Phone
的 SQLite
SDK 都被拉入了完整的应用程序。在这一点上,我假设 Windows Phone 8.1 参考被引入,但 Windows Phone 参考没有,因为它被视为已经被引入那里。这是完全的猜想,但它似乎符合我所看到的。关于如何进行的任何想法?谢谢!
从 nuget 包中删除 pdb 文件。
我找到了解决方案:
仅在 Silverlight 应用程序项目中添加对 SQLite dll 的引用,在后台任务项目(WinRT 运行时组件)中不添加任何内容。
SQLite.net nuget 库将在运行时在应用程序项目和后台任务项目(WinRT 运行时组件)中找到 dll。
我有一个 Windows Phone Silverlight 8.1 应用程序,我想使用 Windows 运行时组件作为后台任务。在这两个项目中,我都想使用 SQLite 来访问应用程序数据库。
我在这里发现了一个类似的问题:
How to use SQLite in Windows (Phone) 8.1's BackgroundTask
这几乎涵盖了所有情况,但还不完全是。关于如何实现我的要求有什么想法吗?
我可以得到非常"close",我在编译阶段得到的最新错误信息如下:
Payload contains two or more files with the same destination path 'sqlite3.pdb'. Source files:
C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\ExtensionSDKs\SQLite.WP80.8.11.1\Redist\Debug\ARM\sqlite3.pdb
C:\Program Files (x86)\Microsoft SDKs\WindowsPhoneApp\v8.1\ExtensionSDKs\SQLite.WP81.8.11.1\Redist\Debug\ARM\sqlite3.pdb
我看到解决此类其他错误的方法是简单地将其中一个引用的 Copy Local 设置为 false,但我不明白在这种情况下这怎么可能,因为两者实际上都是必填。
提前致谢!
更新 1: 使用下面 scottisafool 的建议,我从 SQLite SDK 文件夹中删除了 pdb 文件,这让我更进一步,即它至少现在可以编译。但是,后来我运行陷入了另一个问题...
然后我开始在后台任务中删除用于访问数据库的代码,在使用 "not a valid WinRT Type" 跳过一些步骤后,我现在已经编译好了,看起来应该可以工作。但是,当我然后尝试 运行 应用程序和 运行 之前运行良好的代码时,即在应用程序首次加载时创建数据库,我 运行 进入此错误:
The specified module could not be found. (Exception from HRESULT: 0x8007007E)
具有以下堆栈跟踪:
at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
at Sqlite.Sqlite3.sqlite3_open_v2(String filename, Database& db, Int32 flags, String zVfs)
at SQLite.Net.Platform.WindowsPhone8.SQLiteApiWP8.Open(Byte[] filename, IDbHandle& db, Int32 flags, IntPtr zVfs)
at SQLite.Net.SQLiteConnection..ctor(ISQLitePlatform sqlitePlatform, String databasePath, SQLiteOpenFlags openFlags, Boolean storeDateTimeAsTicks, IBlobSerializer serializer, IDictionary`2 tableMappings, IDictionary`2 extraTypeMappings, IContractResolver resolver)
at SQLite.Net.SQLiteConnection..ctor(ISQLitePlatform sqlitePlatform, String databasePath, Boolean storeDateTimeAsTicks, IBlobSerializer serializer, IDictionary`2 tableMappings, IDictionary`2 extraTypeMappings, IContractResolver resolver)
at DatabaseContext.OnCreate(String databaseFilePath)
更新 2: 上面的错误消息 ONLY 一旦我添加对我的 Windows Phone 8.1 Portable Class 库(包含所有 SQLite 代码)的引用就会发生BackgroundTask Windows 运行时组件项目。必须在这一点上:
- 用于 Windows Phone 8.1 的 SQLite
- 用于 Windows Phone 的 SQLite
SDK 都被拉入了完整的应用程序。在这一点上,我假设 Windows Phone 8.1 参考被引入,但 Windows Phone 参考没有,因为它被视为已经被引入那里。这是完全的猜想,但它似乎符合我所看到的。关于如何进行的任何想法?谢谢!
从 nuget 包中删除 pdb 文件。
我找到了解决方案:
仅在 Silverlight 应用程序项目中添加对 SQLite dll 的引用,在后台任务项目(WinRT 运行时组件)中不添加任何内容。
SQLite.net nuget 库将在运行时在应用程序项目和后台任务项目(WinRT 运行时组件)中找到 dll。