Как использовать SQLite в приложении Windows Phone 8.1 Silverlight и WinRT Runtime Component
У меня есть ситуация, когда у меня есть приложение Windows Phone Silverlight 8.1, и я хотел бы использовать компонент среды выполнения Windows в качестве фоновой задачи. В обоих этих проектах я хочу использовать SQLite для доступа к базе данных приложений.
Я нашел похожий вопрос здесь:
Как использовать SQLite в Windows (Phone) 8.1's BackgroundTask
Это почти охватывает ситуацию, но не совсем. Любые идеи о том, как добиться того, что я прошу?
Я могу получить очень "близко", последнее сообщение об ошибке, которое я получаю на этапе компиляции, выглядит следующим образом:
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\3.8.11.1\Redist\Debug\ARM\sqlite3.pdb
C:\Program Files (x86)\Microsoft SDKs\WindowsPhoneApp\v8.1\ExtensionSDKs\SQLite.WP81\3.8.11.1\Redist\Debug\ARM\sqlite3.pdb
Я видел, что решение других ошибок этого типа состоит в том, чтобы просто установить Copy Local на false для одной из ссылок, но я не вижу, как это было бы возможно в этом случае, поскольку на самом деле требуются обе.
Заранее спасибо!
ОБНОВЛЕНИЕ 1: Используя предложение от scottisafool ниже, я удалил файл pdb из папки SQLite SDK, и это немного продвинуло меня, то есть, по крайней мере, теперь он компилируется. Однако потом я сталкиваюсь с другой проблемой...
Затем я начинаю заглушать код для доступа к базе данных в фоновой задаче, и после того, как я перепрыгнул через несколько циклов с "недопустимым типом WinRT", я нахожусь в точке, где все это компилируется и похоже, что оно должно работать. Однако, когда я пытаюсь запустить приложение и запустить код, который раньше работал нормально, то есть создать базу данных при первой загрузке приложения, я сталкиваюсь с этой ошибкой:
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: вышеприведенное сообщение об ошибке появляется ТОЛЬКО после того, как я добавляю ссылку на мою переносимую библиотеку классов Windows Phone 8.1 (которая содержит весь код SQLite) в проект компонента среды выполнения Windows BackgroundTask. На этом этапе должно быть:
- SQLite для Windows Phone 8.1
- SQLite для Windows Phone
SDK оба загружаются в полное приложение. В этот момент я предполагаю, что ссылка на Windows Phone 8.1 загружается, а ссылка на Windows Phone - нет, потому что она считается уже существующей. Это полная догадка, но, похоже, она соответствует тому, что я вижу. Есть мысли о том, как поступить? Спасибо!
2 ответа
Я нашел решение:
Добавьте ссылку на dll SQLite только в проекте приложения Silverlight и ничего в проекте фоновой задачи (WinRT Runtime Component).
Библиотека nuget SQLite.net найдет dll во время выполнения, как в проекте приложения, так и в проекте фоновой задачи (WinRT Runtime Component).