2017-03-25 3 views
0

J'ai une application écrite en utilisant Xamarin pour Android qui me permet de stocker les informations de mes clients. Je stocke toutes les données localement en utilisant sqlite et tout fonctionne bien. Mais j'ai besoin de partager cette information avec mon collègue qui utilise la même application sur son téléphone. Ainsi, par exemple, si j'ajoute une nouvelle commande client à partir de mon téléphone, celle-ci sera enregistrée dans ma base de données locale. Maintenant je veux appuyer sur un bouton pour déclencher la synchronisation de ma base de données locale avec une sauvegarde de cette banque de données dans un dossier partagé dans Dropbox ou Google Drive.,Xamarin: comment sauvegarder/synchroniser une base de données sqlite avec DropBox ou Google Drive

De suggestions ci-dessous, j'essaie d'utiliser DropBox Core Api . Je suis arrivé au point où je m'authentifier pour accéder à mon compte, maintenant je dois copier ma base de données locale dans mon dossier d'application dans Dropbox. J'utilise le code ci-dessous pour ma deuxième activité. Quand il se lance, j'obtiens la page d'authentification pour Dropbox. Après cela, lorsque je clique sur le bouton de sauvegarde, je m'attends à lire la base de données locale et à l'enregistrer dans Dropbox sous ./Apps/ClientsApp/. Mais je reçois seulement une erreur générique (une exception non gérée est survenue). Où est-ce que je fais une erreur?

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

Vous voulez dire que vous ne trouvez pas de fichier db? Vous devriez avoir un chemin dans votre code, utilisé pour créer SQLiteConnection (si vous l'utilisez). – DawidSibinski

+0

Le chemin ne m'est pas accessible. J'ai mon magasin de DB ici: dbPath = System.IO.Path.Combine (System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal), "myDB.db3"); – opt

+0

Pourquoi vous n'avez pas accès? J'ai juste essayé de créer une variable de fichier lui donnant le chemin au dossier de DB et cela fonctionne. Essayez: Fichier a = nouveau fichier (System.IO.Path.Combine (System.Environment.GetFolderPath (Syst em.Environment.Speci alFolder.Personal), "myDB.db3")); Avec la variable Fichier, vous pouvez copier le fichier db/l'exporter vers un stockage cloud externe. – DawidSibinski

Répondre

1

Vous devez d'abord récupérer votre fichier de base de données. Vous pouvez le faire comme suit:

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

Une fois que vous avez la variable dbFile, vous pouvez le copier sur une carte SD ou exporter vers Dropbox/GDrive. Voir this answer pour plus de détails sur l'exportation vers Dropbox.

EDIT: API Dropbox mentionné dans la réponse que je lié semble être dépréciée, voici le composant pour Xamarin: https://components.xamarin.com/view/dropboxcoreapiandroid

EDIT:

Si vous souhaitez copier votre fichier de base de données de stockage externe (par exemple Carte SD), vous devez ajouter les autorisations nécessaires pour votre application Android.

Pour pouvoir écrire un fichier à cet emplacement, vous devez ajouter l'autorisation WRITE_EXTERNAL_STORAGE à votre application. Vous pouvez le faire en allant dans votre projet Android -> Propriétés -> onglet "Android Manifest" -> Dans la section "Autorisations requises", sélectionnez WRITE_EXTERNAL_STORAGE. Vous pouvez également sélectionner READ_EXTERNAL_STORAGE pour pouvoir lire et écrire depuis ou vers un stockage externe.

+0

J'ai copié votre ligne pour obtenir dbFile mais j'ai une erreur (Impossible de créer une instance du static classe 'Fichier'). Comment puis-je resoudre ceci? – opt

+1

@opt Vous utilisez probablement System.IO.File, alors que vous devez utiliser Java.IO.File. Assurez-vous de faire référence à la bonne. – DawidSibinski

+0

Oui, en utilisant Java.IO.File résout ce problème. En passant, j'essaie d'utiliser plutôt System.IO.File.Copy (origine, destination, true), où origine et destination sont des chaînes pour le chemin du fichier. Mais j'ai des problèmes d'autorisation, je ne sais pas si c'est pour l'origine de la destination.Je suis mise à jour ma demande ci-dessus avec plus de détails au cas où vous pouvez aider. Merci. – opt