我有一个使用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();
}
}
}
}
答案 0 :(得分:1)
您需要先检索数据库文件。你可以这样做:
File dbFile = new File(System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "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
以便能够读取和写入外部存储器。