Xamarin:如何使用DropBox或Google Drive备份/同步sqlite数据库

时间:2017-03-25 16:54:43

标签: c# database sqlite xamarin xamarin.android

我有一个使用Xamarin for Android编写的应用程序,它允许我存储我的客户信息。我使用sqlite在本地存储所有数据,一切正常。但我需要与我的同事在手机上使用相同的应用程序分享这些信息。因此,例如,如果我从手机添加新客户订单,则会将其保存到我的本地数据库中。 现在我想按一个按钮来触发我的本地数据库与Dropbox或Google Drive中的共享文件夹中的这个数据库存储的一些备份的同步。

根据以下建议,我尝试使用DropBox Core Api。我到了我要验证访问帐户的地步,现在我需要在Dropbox的app文件夹中复制我的本地数据库。我正在使用下面的代码进行第二次活动。当它启动时,我获得了Dropbox的身份验证页面。之后,当我单击备份按钮时,我希望读取本地数据库并将其保存到./Apps/ClientsApp/下的Dropbox。但我只得到一般错误(发生未处理的异常)。我在哪里弄错了?

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();
        }
    }


}
}

1 个答案:

答案 0 :(得分:1)

您需要先检索数据库文件。你可以这样做:

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

拥有dbFile变量后,您可以将其复制到SD卡或导出到Dropbox / GDrive。有关将其导出到Dropbox的更多详细信息,请参阅this answer

编辑: 我链接的答案中提到的Dropbox API似乎已被弃用,这里是Xamarin的组件:https://components.xamarin.com/view/dropboxcoreapiandroid

编辑:

如果要将数据库文件复制到外部存储设备(例如SD卡),则需要为Android应用添加必要的权限。

为了能够在此类位置撰写文件,您需要为您的应用添加WRITE_EXTERNAL_STORAGE权限。你可以通过转到你的Android项目来做到这一点 - &gt;属性 - &gt; &#34; Android Manifest&#34;标签 - &gt;在第34节中;所需权限&#34;选择WRITE_EXTERNAL_STORAGE。您也可以选择READ_EXTERNAL_STORAGE以便能够读取和写入外部存储器。