Невозможно открыть файл базы данных после загрузки в SkyDrive

У меня есть приложение WP7, которое использует базу данных SQLite. Особенностью приложения является резервное копирование в SkyDrive, которое отлично работает, но после этого мое приложение выдает «невозможно открыть файл базы данных». Если я немного подожду (где-то от 10 до 60 секунд), он снова начнет работать. Я не знаю, связана ли проблема с Live SDK, IsolatedStorage или чем-то еще, но мне кажется, что проблема в том, что файл все еще используется после завершения загрузки. (Что бы это ни стоило, я не считаю, что это строго ошибка SQLite.)

Я использую следующий код (отредактированный для краткости):

private void Upload() {
    this._LiveClient.UploadProgressChanged += UploadProgressChanged;
    this._LiveClient.UploadCompleted += UploadCompleted;

    IsolatedStorageFileStream stream = null;

    try {
        using( IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication() ) {
            stream = store.OpenFile( "mydatabasefile.dat", FileMode.Open, FileAccess.Read );
        }

        this._LiveClient.UploadAsync( "DestinationPath", "DestinationFilename.sqlite", true, stream, null );
    } catch( Exception e ) {
        MessageBox.Show( e.Message, "Error", MessageBoxButton.OK );
    }
}

private void UploadCompleted( object sender, LiveOperationCompletedEventArgs e ) {
    if( e.Error == null ) {
        MessageBox.Show( "File successfully uploaded.", "Backup", MessageBoxButton.OK );
        if( this.NavigationService.CanGoBack ) this.NavigationService.GoBack();
    } else {
        MessageBox.Show( e.Error.Message, "Upload Error", MessageBoxButton.OK );
    }
}

После перехода назад (который всегда будет моей главной страницей) все, что я пытаюсь сделать, требующее доступа к базе данных (например, переход на мою страницу просмотра и отображение записи), выдает ошибку (опять же, пока я немного не подожду).

Я не уверен, нужен ли мне где-то оператор Close или даже просто цикл, проверяющий состояние файла, пока он не будет закрыт, или что-то в этом роде.


person Michael Itzoe    schedule 01.10.2013    source источник


Ответы (1)


Вам нужно добавить stream.Dispose(); в UploadCompleted, и это должно решить вашу проблему (единственное, что нужно иметь в виду, это то, что вы не сможете получить доступ к базе данных во время загрузки, если вам нужно сделать это, тогда вы также необходимо создать копию файла Db перед его загрузкой).

person Benoit Catherinet    schedule 02.10.2013
comment
Это помогло, спасибо. Я думаю, я думал, что поток не связан с IsolatedStorageFile, поскольку после создания потока и закрытия объекта store потоком using файл не будет затронут потоком. Живи и учись. - person Michael Itzoe; 02.10.2013