2017-03-25 1 views
0

Ich habe eine App mit Xamarin für Android geschrieben, mit der ich meine Kundeninformationen speichern kann. Ich speichere alle Daten lokal mit sqlite und alles funktioniert gut. Aber ich muss diese Informationen mit meinem Kollegen teilen, der die gleiche App auf seinem Telefon verwendet. Wenn ich zum Beispiel eine neue Kundenbestellung von meinem Telefon hinzufüge, wird dies in meiner lokalen Datenbank gespeichert. Jetzt möchte ich einen Knopf drücken, um die Synchronisation meiner lokalen Datenbank mit einem Backup dieser Datenbank in einem freigegebenen Ordner in Dropbox oder Google Drive auszulösen.,Xamarin: Wie man eine SQLite-Datenbank mit DropBox oder Google Drive sichert/synchronisiert

Von den Vorschlägen unten versuche ich DropBox Core Api . Ich habe den Punkt erreicht, an dem ich mich authentifiziere, um auf mein Konto zuzugreifen. Jetzt muss ich meine lokale Datenbank in meinem App-Ordner in Dropbox kopieren. Ich verwende den folgenden Code für meine zweite Aktivität. Wenn es gestartet wird, erhalte ich die Authentifizierungsseite für Dropbox. Danach, wenn ich auf die Backup-Schaltfläche klicke, erwarte ich, die lokale DB zu lesen und sie in Dropbox unter ./Apps/ClientsApp/ zu speichern. Aber ich bekomme nur einen generischen Fehler (Eine unbehandelte Ausnahme ist aufgetreten). Wo mache ich einen Fehler?

using Dropbox.CoreApi; 
using Dropbox.CoreApi.Android; 
using Dropbox.CoreApi.Android.Session; 

namespace my_app 
{ 
[Activity(Label = "Second Activity")] 
class clientsDB : Activity 
{ 
    string AppKey = "myAppKey"; 
    string AppSecret = "myAppSecret"; 
    DropboxApi dropboxApi; 
    private Button backup; 

    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.clientsDB); 

     // dropbox 
     AppKeyPair appKeys = new AppKeyPair(AppKey, AppSecret); 
     AndroidAuthSession session = new AndroidAuthSession(appKeys); 
     dropboxApi = new DropboxApi(session); 

     (dropboxApi.Session as AndroidAuthSession).StartOAuth2Authentication(this); 

     backup = FindViewById<Button>(Resource.Id.backup); 
     backup.Click += Backup_Click; 
    } 


    private void Backup_Click(object sender, EventArgs e) 
    { 
     string origin = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "dbClients.db3"); 

     string dropboxPath = @"./Apps/ClientsApp"; 
     upload(origin, dropboxPath); 

    } 

    // use async cause I had Android.OS.NetworkOnMainThreadException 
    async void upload(string origin, string destination) 
    {    
     using (var input = File.OpenRead(origin)) 
     { 
      // Gets the local file and upload it to Dropbox 
      dropboxApi.PutFile(destination, input, input.Length, null, null); 
     } 
    } 

    protected async override void OnResume() 
    { 
     base.OnResume(); 

     // After you allowed to link the app with Dropbox, 
     // you need to finish the Authentication process 
     var session = dropboxApi.Session as AndroidAuthSession; 
     if (!session.AuthenticationSuccessful()) 
      return; 

     try 
     { 
      // Call this method to finish the authentication process 
      session.FinishAuthentication(); 
     } 
     catch (IllegalStateException ex) 
     { 
      Toast.MakeText(this, ex.LocalizedMessage, ToastLength.Short).Show(); 
     } 
    } 


} 
} 
+0

Sie meinen, Sie können eine db-Datei nicht finden? Sie sollten einen Pfad dazu in Ihrem Code haben, der zum Erstellen von SQLiteConnection verwendet wird (falls Sie ihn verwenden). – DawidSibinski

+0

Der Pfad ist für mich nicht zugänglich. Ich habe meine Datenbank hier speichern: dbPath = System.IO.Path.Combine (System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal), "myDB.db3"); – opt

+0

Warum haben Sie keinen Zugang? Ich habe gerade versucht, eine Datei-Variable zu erstellen, die den Pfad zur DB-Datei gibt, und es funktioniert. Versuchen Sie: Datei a = neue Datei (System.IO.Path.Combine (System.Environment.GetFolderPath (Syst em.Environment.Speci alFolder.Personal), "myDB.db3")); Mit der Dateivariable können Sie die db-Datei kopieren/in den externen Cloud-Speicher exportieren. – DawidSibinski

Antwort

1

Sie müssen zuerst Ihre Datenbankdatei abrufen. Sie können es wie folgt:

File dbFile = new File(System.IO.Path.Combine(System.Environment.GetFolderPath‌​(Syst‌​em.Environmen‌​t.Speci‌​alFolder.Pe‌​rsonal), "myDB.db3")); 

Nachdem Sie dbFile Variable haben, können Sie es auf SD-Karte oder den Export in Dropbox/GDrive kopieren. Weitere Informationen zum Exportieren in Dropbox finden Sie unter this answer.

EDIT: Dropbox API in der Antwort habe ich erwähnt, scheint verknüpft veraltet zu sein, hier ist die Komponente für Xamarin: https://components.xamarin.com/view/dropboxcoreapiandroid

EDIT:

Wenn Sie Ihre Datenbank-Datei auf externe Speicher kopieren (zB SD-Karte), müssen Sie die erforderlichen Berechtigungen für Ihre Android-App hinzufügen.

Um eine Datei an einem solchen Ort schreiben zu können, müssen Sie Ihrer App die Berechtigung WRITE_EXTERNAL_STORAGE hinzufügen. Sie können es tun, indem Sie zu Ihrem Android-Projekt gehen -> Eigenschaften -> "Android Manifest" -Registerkarte -> Im Abschnitt "Erforderliche Berechtigungen" wählen Sie WRITE_EXTERNAL_STORAGE. Sie können auch READ_EXTERNAL_STORAGE auswählen, um von/zu externem Speicher lesen und schreiben zu können.

+0

Ich habe Ihre Zeile kopiert, um dbFile zu bekommen, aber ich habe einen Fehler (kann keine Instanz der statischen erstellen Klasse 'Datei'). Wie kann ich das lösen? – opt

+1

@opt Sie verwenden wahrscheinlich System.IO.File, während Sie Java.IO.File verwenden sollten. Stellen Sie sicher, dass Sie auf das richtige verweisen. – DawidSibinski

+0

Ja mit Java.IO.File löst dieses Problem. Nebenbei versuche ich stattdessen, System.IO.File.Copy (Ursprung, Ziel, wahr) zu verwenden, wobei Ursprung und Ziel Zeichenfolgen für den Dateipfad sind. Aber ich bekomme Genehmigungsprobleme, nicht sicher, ob das für den Ursprung für das Ziel ist.Ich aktualisiere meine Anfrage oben mit weiteren Details, falls Sie mir helfen können. Vielen Dank. – opt

Verwandte Themen