2016-07-22 14 views
0

Ich muss eine vorbefüllte Datenbank in meiner Xamarin.Forms-Anwendung verwenden, also suchte ich nach möglichen Lösungen.Umgang mit vorbefüllten Datenbank in Windows Phone 8.1

Ich habe diese article gefunden und mit Android getestet - es hat funktioniert.

Es verwendet jedoch Windows Phone 8 - das ist nicht kompatibel mit Windows 8.1. So

ich versucht, dieses Windows Phone 8-Code zu ändern:

public static void CopyDatabaseIfNotExists(string dbPath) 
{ 
    var storageFile = IsolatedStorageFile.GetUserStoreForApplication(); 

    if (!storageFile.FileExists(dbPath)) 
    { 
    using (var resourceStream = Application.GetResourceStream(new Uri("people.db3", UriKind.Relative)).Stream) 
    { 
     using (var fileStream = storageFile.CreateFile(dbPath)) 
     { 
     byte[] readBuffer = new byte[4096]; 
     int bytes = -1; 

     while ((bytes = resourceStream.Read(readBuffer, 0, readBuffer.Length)) > 0) 
     { 
      fileStream.Write(readBuffer, 0, bytes); 
     } 
     } 
    } 
    } 
} 

In diesem Code:

public static async void CopyDatabaseIfNotExists(string dbPath) 
{ 
    IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder; 

    StorageFile existingFile = await Windows.Storage.StorageFile.GetFileFromPathAsync("prep.db"); 
    IStorageFile storageFile = await applicationFolder.GetFileAsync(dbPath); 

    if (storageFile == null) 
    { 
    await existingFile.CopyAndReplaceAsync(storageFile); 

Allerdings funktioniert es nicht, ich kann nicht eine richtige Filepath sorgen für meine db vorhandene Datei (es ist in der Wurzel des Projekts), es gibt mir immer diese Fehlermeldung:

Value does not fall within the expected range.

Wie konnte ich ein richtiger Pfad zu meiner voraufgefüllten Datei?

Warum muss ich auch eine Stream-basierte "Kopie" verwenden, wenn ich einfach die Datei selbst kopieren könnte?

+0

Wo es Ihnen nicht geben diesen Fehler (dh die Codezeile?) –

+0

@RowlandShaw Wenn ich versuche, meine vorhandenen vorbelegt Datenbank zu erhalten: ' StorageFile existingFile = erwartet Windows.Storage.StorageFile.GetFileFromPathAsync ("prep.db"); ' – Nestor

Antwort

0

Der folgende Code funktioniert für Windows Phone 8.1 und UWP:

public async void CopyDatabaseIfNotExists(string dbPath) 
{ 
    IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder; 
    var existingFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(myDBFileName); 

    if (!await CheckForExistingFile(myDBFileName)) 
    await existingFile.CopyAsync(applicationFolder); 
} 

private async Task<bool> CheckForExistingFile(string filePath) 
{ 
    try 
    { 
    var file = await ApplicationData.Current.LocalFolder.GetFileAsync(Uri.EscapeDataString(filePath)); 
    //no exception means file exists 
    return true; 
    } 
    catch (FileNotFoundException ex) 
    { 
    //find out through exception 
    return false; 
    } 
}