Чтобы иметь возможность использовать SQLite в своем проекте UWP, я добавил пакеты Nuget System.Data.SQLite.Core 1.0.111 и Dapper 1.60.6. Он отлично строится и работает. Однако, когда я попытался развернуть этот проект в магазине, я получаю следующие ошибки:
File C:\myApp\sni.dll has failed the AppContainerCheck check.
File C:\myApp\SQLite.Interop.dll has failed the AppContainerCheck check.
API CryptDuplicateKey in advapi32.dll is not supported for this application type. SQLite.Interop.dll calls this API.
API AreFileApisANSI in kernel32.dll is not supported for this application type. SQLite.Interop.dll calls this API.
...
Я установил флажок «Скомпилировать с собственным набором инструментов» и построил его на конфигурации выпуска, как это предлагается в комплекте сертификации приложений для Windows и другом ответе stackoverflow, но проблема не устранена.
Также в результатах тестирования комплекта сертификации приложений для Windows говорится:
"Apply the required linker options - SAFESEH, DYNAMICBASE, NXCOMPAT, and APPCONTAINER - when you link the app."
Я использую VS 2019, и, учитывая, что этот проект написан на С# (не С++), я не уверен, что параметры компоновщика даже применимы для моего случая.
Еще одна странность заключается в том, что, в отличие от пакетов x86 и x64, нет проблем с развертыванием пакета arm.
Можно ли решить эту проблему, или я должен вообще прекратить использовать эти пакеты nuget.
Да. На самом деле вторая часть, поддерживаемый тест API, я думаю, появляется только в локальном WACK, хотя не уверен.
К сожалению, онлайн WACK тоже не пропускает пакеты. Он выдает первую ошибку, как это делает WACK, но вторая ошибка на этот раз не такая толстая.
он много жалуется на sni.dll
Библиотеки Dapper и SQLite в Nuget кажутся довольно современными. Фильтрует ли Nuget Manager пакеты для UWP? Я думал, что мы можем просто использовать пакеты, которые мы видим в диспетчере пакетов nuget.
Я хочу знать, следуете ли вы этому официальному документу Использование базы данных SQLite в приложении UWP, чтобы использовать базу данных sqlite в своем приложении uwp.
Я не использовал пакеты nuget на указанной странице. Я использовал System.Data.SQLite.Core от команды разработчиков SQLite и Dapper, потому что с ними мне было удобнее. Я думаю, мне нужно переключиться на те, что по этой ссылке. Спасибо за вашу помощь.
Верно. Вы должны следовать официальному документу.





Кажется, что это пока невозможно. Итак, позвольте мне написать другие возможные решения и мой опыт работы с ними.
1 - Использование пакета Microsoft.Data.SQLite
Как предложил Ксавьер Се в разделе комментариев, вы можете использовать это руководство в MSDN. Это своего рода ванильная библиотека для использования SQLite в приложении UWP.
Я не предпочел это по нескольким причинам. На мой взгляд, это многословно по синтаксису и не так уж тривиально для начала. Вы должны быть осторожны с версиями пакетов, которые вы устанавливаете. Что еще более важно, в моем случае вам нужно изменить свои функции чтения и обновления для класса по мере изменения полей этого класса. Таким образом, его сложнее поддерживать, чем при использовании библиотек более высокого уровня, таких как Dapper.
2 - Используйте Entity Framework
Использование структуры сущностей проще в обслуживании, но я думаю, что с ним сложно начать. У меня уже была база данных, и в этом случае документация не так уж полезна.
3 - Используйте метод, отличный от SQLite, для хранения данных
Поскольку у меня есть некоторые исходные данные, и они не должны быть такими большими, я предпочел использовать файлы json для их хранения и обновления.
Я использовал Пакет Newtonsoft Nuget для сериализации и десериализации классов и использовал Класс ApplicationData для хранения данных. Я думаю, что оба они очень просты в использовании и хорошо документированы с четкими примерами.
Вот некоторые части кода из того, что я сделал:
const string myDataFilename= "myData.json";
const string backupFolderPath = "ms-appx:///DataModel/";
async Task LoadData()
{
string json = await StorageApi.ReadFromFile(myDataFilename, backupFolderPath + myClassFilename);
try
{
myList = JsonConvert.DeserializeObject<List<myClass>>(json);
}
catch
{
// maybe do some reset logic here
await StorageApi.CopyFile(backupFolderPath + myDataFilename, myDataFilename);
await LoadData();
}
}
async public void saveData()
{
string json = JsonConvert.SerializeObject(myList);
await StorageApi.WriteToFile(myDataFilename, json);
}
И я написал класс-оболочка для использования класса ApplicationData На случай, если ссылки не работают, вот код из него:
public static async Task WriteToFile(string relativePath, string data)
{
StorageFile sampleFile = await localFolder.CreateFileAsync(relativePath,
CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(sampleFile, data);
}
// Read data from a file
public static async Task<string> ReadFromFile(string relativePath, string backupPath = "")
{
try
{
StorageFile sampleFile = await localFolder.GetFileAsync(relativePath);
return await FileIO.ReadTextAsync(sampleFile);
}
catch (FileNotFoundException e)
{
Debug.WriteLine( "Relative path: {0}, backupPath: {1}, Error str: {2}", relativePath, backupPath, e.Message);
if (backupPath == "")
return "";
else
{
await CopyFile(backupPath, relativePath);
return await ReadFromFile(relativePath);
}
}
catch (IOException e)
{
Debug.WriteLine(e.Message);
}
return "";
}
public static async Task CopyFile(string src, string relativeDst)
{
try
{
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(
new Uri(src));
await file.CopyAsync(localFolder, relativeDst, NameCollisionOption.ReplaceExisting);
}
catch (FileNotFoundException e)
{
Debug.WriteLine(e.Message);
}
catch (IOException e)
{
Debug.WriteLine(e.Message);
}
}
Примечание. Я выберу этот ответ как принятый на данный момент. Если появится лучший ответ, который решает точную проблему, я приму его вместо этого.
Вы столкнулись с этими ошибками в вашем локальном WACK?