在上几篇的基础上,我们已经将android应用内部的数据库读取到了pc端,并且显示了出来,接下来,我们尝试Pc端修改数据,并且将数据覆盖到android端应用。
总体和上一篇读取数据库的思路相反,我们先将pc端修改的数据保存到数据库Db文件中,核心代码如下:
/// <summary>
/// 保存修改
/// </summary>
public void SaveChange()
{
//本地数据库地址
string path = strPCFilePath + "\\" + dbName;//数据库所在路径
//使用SQLite.Net-PCL访问数据库
using (var db = new AndroidDb(path))
{
var list = userList.ToList().ConvertAll<UserDbModel>(m => m.dbModel);
//获取所有需要更新的数据
List<UserDbModel> updateList = list.FindAll(m => m.Id != 0);
//更新数据
int effectRowsCount = db.UpdateAll(updateList);
m_log.Debug("更新数据" + effectRowsCount + "条");
//添加数据
List<UserDbModel> addList = list.FindAll(m => m.Id == 0);
int addEffectRowsCount = db.InsertAll(addList);
m_log.Debug("添加数据" + addEffectRowsCount + "条");
StatusStr = "数据已经保存完毕,等待同步到移动端";
}
}
然后,我们通过adb命令,将这个文件push到我们的安卓设备上
/// <summary>
/// 将数据推送到移动端
/// </summary>
public async void WriteInfotoDeviceAsync()
{
StatusStr = "正在推送数据到设备";
bool pushOk = await Task.Factory.StartNew<bool>(() =>
{
string dbDevicePath = sdCardPath + "/" + appPackageName + "/" + deviceSaveDbDir;//+ "/" + dbName;
bool success = AdbHelper.CopyToDevice(devs[0], strPCFilePath, dbDevicePath);
return success;
});
if (!pushOk)
{
StatusStr = "推送设备到设备失败,具体原因请查看日志";
}
//推送成功,给应用发送广播,更新数据 广播通知不成功
//AdbHelper.SendBroadCastToDevice(devs[0],Const.BROADCAST_ACTION_PC_PUSHED);
//StatusStr = "已经推送数据到设备";
StatusStr = "推送成功,请前往手机更新数据库";
}
接下来,在我们的安卓应用中,将pc端push的db文件,拷贝覆盖到应用程序的database目录下,覆盖旧的数据库,并且更新界面,pc向android传送数据的功能就算基本实现了。
if (copyDbFromPublicDirectory()) {
//刷新界面
}
/**
* 从外部的public目录下拷贝db文件
*/
public boolean copyDbFromPublicDirectory() {
boolean success = false;
try {
File documentDir = Environment.getExternalStorageDirectory();
//pc端推送的地址
String saveDir = documentDir.getAbsolutePath() + "/" + packageName + "/" + "dbfiles" + "/" + Const.DB_NAME;
;
//应用内db文件路径
String dbDirPath = "/data/data/" + packageName
+ "/databases/" + Const.DB_NAME;
File originFile = new File(saveDir);
if (!originFile.exists()) {
Log.i("hf", "pc推送的文件不存在");
// Toast.makeText(this,"pc推送的文件不存在",Toast.LENGTH_LONG).show();
return success;
}
File f_saveFile = new File(dbDirPath);
//拷贝文件
FileUtils.copyFileUsingFileChannels(originFile, f_saveFile);
success = true;
} catch (Exception ex) {
Log.e("hf", ex.getMessage());
}
return success;
}
时间有限,好多更加美好的功能没有实现,可能可以优化的地方:1.db文件在copy的过程中,很可能被别人复制,或许可以加上一些安全性措施(锁?加密?)2.可以利用adb以及adb操作设备(发送广播,启动页面,启动服务)等方式,实现数据线一插,所有操作自主完成,不是现在点按钮进行,体验更佳
相关代码地址,包括WPF端和PC端,请到 下载地址下载