Открытие SQLite-соединения в UWP сразу после перемещения StorageFile
Пролог:
Я пишу клиент с графическим интерфейсом SQLite для UWP. я использую
Microsoft.Data.Sqlite
библиотека для SQLite API с C #. Также я использую таблицу перенаправления, чтобы иметь возможность открывать базу данных в моем приложении-песочнице, которое опубликовано в Microsoft Store. Таблица перенаправления заменяет
CreateFileW
к
CreateFileFromAppW
звонки и тому подобное.
Проблема:
Пользователь имеет
File
->
Save as
характерная черта. Когда пользователь создает новый файл базы данных, он создается внутри локального каталога приложения. Затем, когда пользователь сохраняет свою базу данных, так как мне нужно переместить этот файл. я использую
StorageFile
Причина API, что я не могу использовать какой-либо другой файловый API в приложении-песочнице. Поэтому я звоню:
var savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
savePicker.FileTypeChoices.Add("SQLite3 Database", new List<string>() { ".sqlite", ".db" });
savePicker.SuggestedFileName = "Database";
var file = await savePicker.PickSaveFileAsync();
if(null != file)
{
Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(file);
sqliteConnection.Close(); // it is important cause if I skip this moving a file will fail
var localFolder = ApplicationData.Current.LocalFolder;
var currentStorageFile = await localFolder.GetFileAsync(App.UnsavedDatabaseFileName); // here I obtain StorageFile for opened database
await currentStorageFile.MoveAndReplaceAsync(file); // here I move a file
sqliteConnection = new SqliteConnection("Data Source=" + file.Path);
sqliteConnection.Open(); // this line fails with error 14: cannot open database file
}
Я также попытался пропустить закрытие и повторное открытие соединения -> затем перемещение файла не удалось. Если я позвоню между
await currentStorageFile.MoveAndReplaceAsync(file);
а также
sqliteConnection = new SqliteConnection("Data Source=" + file.Path);
тогда все будет работать нормально, но отображение средства выбора открытия файла сразу после средства выбора сохранения файла - очень плохой пользовательский интерфейс. Я знаю, что изолированное приложение дает разрешение на доступ к файлу только после того, как пользователь выбрал файл вручную. Но похоже на то
FileSavePicker
не дает мне разрешения так же, как
FileOpenPicker
делает. Я не смог найти никакой информации об этом.
Эпилог:
Это приложение https://sqliteman.dev . Не стесняйтесь критиковать, потому что это то, что делает мое приложение лучше.
3 ответа
Приложение Uwp может использовать возможность broadFileSystemAccess. Эта возможность позволяет приложениям получать тот же доступ к файловой системе, что и пользователь, который в настоящее время запускает приложение, без каких-либо дополнительных запросов стиля выбора файлов во время выполнения, что работает для API-интерфейсов Windows.Storage.
Если вы хотите его использовать, вам нужно добавить его в Package.appxmanifest, как показано ниже. Кроме того, вам необходимо предоставить разрешение в приложении « Настройки» для этого приложения uwp, доступ можно настроить в « Настройки»> «Конфиденциальность»> «Файловая система».
<Package
...
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap mp rescap">
...
<Capabilities>
<rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>
Попробуйте поставить
MoveAndReplaceAsync()
в операторе using и открывая соединение SQLite за его пределами.
Если это проблема с разрешениями, то одним из решений может быть объявление broadFileSystemAccess в манифесте вашего приложения.
https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions
Мне кажется странным, что у вас нет доступа на запись к создаваемому вами файлу.