Используемый файл синхронизации
Хочу использовать функцию автосинхронизации в программе менеджера баз данных. Автосинхронизация автоматически загружает файл базы данных в облако, если он был изменен.
Моя проблема в том, что база данных всегда использует файл базы данных, а метод загрузки не может получить доступ к файлу.
Код:
Имя файла main.db
использование в методах вставки и BackgroundUploadAsync
public static async void InsertToDatabase(object data)
{
SQLiteAsyncConnection conn = new SQLiteAsyncConnection("Main.db");
await conn.InsertAsync(data);//i cant close the file in async methode
}
public async static void AutoSync()
{
....
if (file != null)
{
var progressHandler = new Progress<LiveOperationProgress>(
(progress) => { /*pr.Value = progress.ProgressPercentage;*/ });
SettingsFlyout1.ctsUpload = new System.Threading.CancellationTokenSource();
LiveConnectClient liveClient = new LiveConnectClient(app.Session);
await liveClient.BackgroundUploadAsync(result, file.Name, file, OverwriteOption.Overwrite, SettingsFlyout1.ctsUpload.Token, progressHandler);
}
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
InsertToDatabase(adat);
AutoSync();//file not found exception,
}
Спасибо за помощь или любые предложения!
1 ответ
Это не может быть идеальным в пространстве, но вы можете создать два файла базы данных. Один in-use
, и один at-rest
,
После каждой записи (или набора записей) копируйте in-use
над at-rest
перед записью каких-либо записей в БД. Возможно, вам потребуется отключиться, а затем снова подключиться после копирования. Это должна быть довольно быстрая операция (намного быстрее, чем загрузка).
Затем, когда вам нужно загрузить, поток с at-rest
версия.
Вам понадобятся блокировки для чтения / записи at-rest
, но, по крайней мере, вы можете читать / писать на in-use
без связи с интернетом.