2017-03-25 6 views
0

Android用のXamarinを使用して私の顧客情報を保存できるアプリがあります。私はsqliteを使用してすべてのデータをローカルに格納し、すべて正常に動作します。しかし、私は彼の電話で同じアプリを使っている同僚とこの情報を共有する必要があります。たとえば、私の電話から新しい顧客注文を追加すると、これはローカルのdbに保存されます。 DropboxまたはGoogleドライブの共有フォルダにあるこのdbストアのバックアップを使用して、ローカルデータベースの同期をトリガーするボタンを押したいと思います。Xamarin:DropBoxまたはGoogleドライブでsqliteデータベースをバックアップ/同期する方法

以下の提案から、Dropbox Core APIを使用しようとしています。私は自分のアカウントにアクセスするために認証するところまで来たので、DropboxのアプリケーションフォルダにローカルDBをコピーする必要があります。私は第2の活動のために以下のコードを使用しています。起動すると、Dropboxの認証ページが表示されます。その後、私がローカルDBを読んで、Dropboxの./Apps/ClientsApp/に保存することを期待しています。しかし、私は一般的なエラー(処理されない例外が発生した)のみを取得します。私はどこでミスをしていますか?

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

あなたはdbファイルを見つけることができないのですか?コード内にSQLiteConnectionを作成するためのパスが必要です(使用している場合)。 – DawidSibinski

+0

パスにアクセスできません。私はここに私のdbストアを持っています:dbPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)、 "myDB.db3"); – opt

+0

あなたはアクセスしていないのはなぜですか?私はちょうどそれがDBファイルへのパスを与えるファイル変数を作成しようとしたと動作します。試してください:ファイル=新しいファイル(System.IO.Path.Combine(System.Environment.GetFolderPath(Syst em.Environment.Speci alFolder.Personal)、 "myDB.db3")); File変数を使用すると、dbファイルをコピーすることも、外部のクラウドストレージにエクスポートすることもできます。 – DawidSibinski

答えて

1

まず、データベースファイルを取得する必要があります。次のようにあなたはそれを行うことができます。

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

あなたがdbFile変数を持っていたら、あなたはDropboxの/ GDriveにSDカードまたはエクスポートにコピーすることができます。 Dropboxへのエクスポートの詳細については、this answerを参照してください。

編集:私はリンクの答えで述べた のDropbox APIが廃止されるようですが、ここではXamarinのためのコンポーネントがあります:https://components.xamarin.com/view/dropboxcoreapiandroid

EDIT:

あなたが外部ストレージにデータベースファイルをコピーする場合(たとえば、 SDカード)、Androidアプリに必要な権限を追加する必要があります。

このような場所にファイルを書き込むには、アプリにWRITE_EXTERNAL_STORAGE権限を追加する必要があります。あなたのAndroidプロジェクト - >プロパティ - > "Android Manifest"タブ - > "必要な権限"セクションで、WRITE_EXTERNAL_STORAGEを選択してください。 READ_EXTERNAL_STORAGEを選択して、外部ストレージとの間で読み書きを行うこともできます。

+0

dbFileを取得するために行をコピーしましたが、エラーがあります(静的クラス 'ファイル')。これをどうすれば解決できますか? – opt

+1

@optおそらくSystem.IO.Fileを使用していますが、Java.IO.Fileを使用するべきです。適切なものを参照してください。 – DawidSibinski

+0

はい、Java.IO.Fileを使用するとその問題は解決します。ところで、私はSystem.IO.File.Copy(origin、destination、true)を代わりに使用しようとしています。originとdestinationはファイルパスの文字列です。しかし、私は認可の問題を得るが、それが目的地のものであるかどうかは分からない。私はあなたが手伝うことができる場合のために上記の私の要求をより詳細に更新しています。ありがとう。 – opt

関連する問題