PC通过数据线读取android数据库(四) 桌面WPF端写入android

       在上几篇的基础上,我们已经将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端,请到 下载地址下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值