App的前后台数据同步
前言
在开发一个点餐软件时,app的订单数据是使用本地Sqlite数据库,在提交订单数据后,当订单数据在后台(Mysql数据库)发生变化时(如:已买单),本地数据如何改变呢?
思路
前台在查询时,将后台订单数据以数组方式发送到前台进行更新(update)
实现
服务端实现
定义一类订单类
package yybwb;
public class orderdetail {
 public Integer id;    //,
 public Integer orderID;
 public Integer menuID;
 public String num;
 public Integer state;
    public String Tno;    //    //
    public String remark; 
 public   orderdetail(int id,int orderID, int menuID,String num, int state,String Tno,String remark)
    {
  this.id = id;
  this.orderID = orderID;
  this.menuID =  menuID;
  this.num = num;
  this.state = state;
  this.Tno= Tno;
  this.remark= remark;
 }
}
通过一方法获取订单信息
 public static ArrayList<orderdetail> getorderdetaillists(String Tabno){
   ArrayList< orderdetail> result = new ArrayList< orderdetail>();
   Connection con = null;   //声明Connection对象
   PreparedStatement ps = null;
   ResultSet rs = null;
   /*
    * tabletal的数据在新订单生成时修改
    */
   String sql = "select orderID,menuID,num,state,Tno,remark from orderdetailtal where state=1";
    try{
    con = getConnection();  //获得连接
    ps = con.prepareStatement(sql); //获得预编译语句
    //ps.setInt(1, Integer.valueOf(r_id)); //设置参数
    rs = ps.executeQuery();   //执行查询
    while(rs.next()){
     String remark = rs.getString(6);
     String Tno = rs.getString(5);
    // int orderID = rs.getInt(1);
     int menuID = rs.getInt(2);
     double num = rs.getDouble(3);
      String.format("%.2f", num); //1.23
     int state =rs.getInt(4);
     //new String(rs.getString(2).getBytes("ISO-8859-1"),CHAR_ENCODING);
      // new String(rs.getString(3).getBytes("ISO-8859-1"),CHAR_ENCODING);
     orderdetail c = new orderdetail(1,1,menuID, String.format("%.2f", num),state,Tno,remark);
     result.add(c);
     //System.out.println(Tno+','+remark);
    }
    System.out.println("get orderdetail lists");
   }catch(Exception e){
    e.printStackTrace();
   }
   finally{
    try{
     if(rs != null){
      rs.close();
      rs = null;
     }
    }catch(Exception e){
     e.printStackTrace();
    }
    try{
     if(ps != null){
      ps.close();
      ps = null;
     }
    }catch(Exception e){
     e.printStackTrace();
    }
    try{
     if(con != null){
      con.close();
      con = null;
     }
    }catch(Exception e){
     e.printStackTrace();
    }
   }
   return result;
  }
  
将订单信息传递到客户端
 else if(msg.startsWith("<#GET_ORDERDETAIL#>")){//消息为获取台表2014-7-22
      msg = msg.substring(19);      //提取内容
      ArrayList<orderdetail> cmList = DBUtil.getorderdetaillists(msg); //获得台列表
      int size = cmList.size();   //个数
      dout.writeInt(size);    //返回个数
      String reply = din.readUTF();  //等待客户端反馈
      if(reply.equals("<#READY_TO_ORDERDETAIL#>")){ //如果客户端已经准备好
       for(orderdetail c:cmList){
        StringBuilder sb = new StringBuilder();
        sb.append(String.valueOf(c.id));
        sb.append("|");
        sb.append(String.valueOf(c.orderID));
        sb.append("|");
        sb.append(String.valueOf(c.menuID));
        sb.append("|");
           sb.append(c.num);
        sb.append("|");
        sb.append(String.valueOf(c.state));
        sb.append("|");
        sb.append(c.Tno);
        sb.append("|");
        sb.append(c.remark);
        dout.writeUTF(sb.toString());  //发送消息到客户端
            }
             }
     }
     
客户端实现
定义一个订单类
package com.realhope.rmeal.bean; /**
*
* @author Wuchunyuan
* 订单明细类
*/
public class OrderDetail{
private Integer _id;
private Integer orderID;
private Integer menuID;
private String num; // 数量
private Integer state; // 状态
private String remark; // 备注
private String Tno; public OrderDetail() {
super();
}
public OrderDetail(Integer _id, Integer orderID, Integer menuID,
String num, Integer state, String Tno,String remark) {
super();
this._id = _id;
this.orderID = orderID;
this.menuID = menuID;
this.num = num;
this.state = state;
this.remark = remark;
this.Tno = Tno;
}
public Integer get_id() {
return _id;
}
public void set_id(Integer _id) {
this._id = _id;
}
public Integer getOrderID() {
return orderID;
}
public void setOrderID(Integer orderID) {
this.orderID = orderID;
}
public Integer getMenuID() {
return menuID;
}
public void setMenuID(Integer menuID) {
this.menuID = menuID;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
} public String getTno() {
return Tno;
}
public void setTno(String Tno) {
this.Tno = Tno;
} }
发送获取订单的消息到服务器,得到服务器发来数据
String msg = "<#GET_ORDERDETAIL#>"+TableN;
mc.dout.writeUTF(msg); //发出获取新菜单表请求
mc.dout.flush();
int size = mc.din.readInt(); //获取个数 mc.dout.writeUTF("<#READY_TO_ORDERDETAIL#>");
mc.dout.flush(); for(int i=0;i<size;i++){
msg = mc.din.readUTF(); //读取每条信息
String [] sa = msg.split("\\|"); //切割字符串 OrderDetail OrderDetaillists = new OrderDetail(Integer.valueOf(sa[0]),Integer.valueOf(sa[1]),
Integer.valueOf(sa[2]),String.valueOf(sa[3]),Integer.valueOf(sa[4]),String.valueOf(sa[5]),
String.valueOf(sa[6]));
((MenuActivity)mContext).lstDate_OrderDetailLists.add(OrderDetaillists);
}
执行SQl语句更新本地Sqlite数据库
/ * 2014-10-14
* @param lstDate_OrderDetailLists
*/ public void updateOrderDetail(List<OrderDetail> lstDate_OrderDetailLists){
DBHelper dbM = new DBHelper(this.context);
SQLiteDatabase db = dbM.getReadableDatabase();
db.execSQL("DROP TABLE IF EXISTS OrderDetailTal");
//db.execSQL("delete from OrderDetailTal");
int Count=lstDate_OrderDetailLists.size();
//创建表
db.execSQL("CREATE TABLE " + OrderDetails.TABLE+ " ("
+ OrderDetails._ID + " INTEGER PRIMARY KEY,"
+ OrderDetails.ORDERID+ " INTEGER,"
+ OrderDetails.MENUID+ " INTEGER,"
+ OrderDetails.NUM + " REAL,"
+ OrderDetails.STATE + " INTEGER,"
+ OrderDetails.Tno + " TEXT,"
+ OrderDetails.REMARK + " TEXT" + ");");
//逐一更新本地数据
for(int i=0 ; i<Count ;){
db.execSQL("insert into "+OrderDetails.TABLE+" ("+OrderDetails.ORDERID+","+ OrderDetails.MENUID+","+
OrderDetails.NUM +","+
OrderDetails.STATE+","+OrderDetails.Tno +","+OrderDetails.REMARK +") " +
"values ('"+String.valueOf(lstDate_OrderDetailLists.get(i).getOrderID())+"','"+
String.valueOf(lstDate_OrderDetailLists.get(i).getMenuID()) +"','"+
lstDate_OrderDetailLists.get(i).getNum() +"','"+
String.valueOf(lstDate_OrderDetailLists.get(i).getState()) +
"','"+String.valueOf(lstDate_OrderDetailLists.get(i).getTno()) +
"','"+String.valueOf(lstDate_OrderDetailLists.get(i).getRemark())+"')");
i++;
} db.close();
return;
}
App的前后台数据同步的更多相关文章
- 连接QuickBooks Online实现于IOS App数据同步功能的个人记录
		公司项目需要用WebService与QBO实现后台数据同步,由于国内没有做过类似第三方产品接口的资料,前前后后找了N久,终于实现功能,现把实现功能步骤贴上来分享: QBO开发者地址(主要用于创建QBO ... 
- Django学习笔记(8)——前后台数据交互实战(AJAX)
		这里将自己这段时间学习的关于前后台数据交互的笔记写在这里,这里包含了Django传输数据给JS,AJAX的相关问题,跨域问题,如何解决AJAX的跨域问题等等.比较凌乱,请看到这篇博客的盆友见谅,如果我 ... 
- AppleWatch___学习笔记(三)iPhone和Apple Watch上的数据同步
		WatchKit App类似于之前iOS 8上新推出的App Extension(应用扩展),比如Today Extension(今天扩展)和Share Extension(分享扩展).只要你对iOS ... 
- 基于ssh框架的highcharts前后台数据交互实例
		Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ... 
- 【转】Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置
		Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置 原贴:https://www.cnblogs.com/jackadam/p/8568833.html ... 
- 高可用的并行MySQL数据同步及分布式
		首先聊聊MySQL的数据分布式,目前最为常用的就是Replication(复制)技术.基于此技术外延开来有很多中架构,分类归结为如下: 1.树状结构(Master,Backup-Master ... 
- Eureka应用注册与集群数据同步源码解析
		在之前的EurekaClient自动装配及启动流程解析一文中我们提到过,在构造DiscoveryClient类时,会把自身注册到服务端,本文就来分析一下这个注册流程 客户端发起注册 boolean r ... 
- Oracle CDC (Change Data Capture)更新数据捕获——Asynchronous HotLog Mode(附带简单的kettle任务实现数据同步)
		Performing Asynchronous HotLog Publishing Step 1 Source Database DBA: Set the database initializat ... 
- Oracle19c单实例数据库配置OGG单用户数据同步测试
		目录 19c单实例配置GoldenGate 并进行用户数据同步测试 一.数据库操作 1.开启数据库附加日志 2.开启数据库归档模式 3.开启goldengate同步 4.创建goldengate管理用 ... 
随机推荐
- 通过Percona Xtrabackup实现数据的备份与恢复
			Xtrabackup简介 Percona XtraBackup是一个开源.免费的MySQL热备份软件,能够为InnoDB和XtraDB数据库执行非阻塞备份,特点如下: 1.快速.可靠的完成备份 2.备 ... 
- 模仿ICE的structured panorama小按钮
			这个按钮的目的是用于手动排列图片序列,应该说写得比较精巧,我使用csharp进行模仿,主要采用的是自动控件创建技术.结果比较简陋,实现功能而已,放出来大家一起学习. ; ; ... 
- Heartbeat高可用解决方案
			Heartbeat高可用 Heartbeat作用: 通过heartbeat,可以将资源(ip以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务 ... 
- sql定时自动备份(定时作业)
			第一步: 右键启动"SQL Server 代理" 
- C#实现谷歌翻译API
			由于谷歌翻译官方API是付费版本,本着免费和开源的精神,分享一下用C#实现谷歌翻译API的代码.这个代码非常简单,主要分两块:通过WebRequest的方式请求内容:获取Get方式的请求参数(难点在于 ... 
- 用C写一个web服务器(四) CGI协议
			* { margin: 0; padding: 0 } body { font: 13.34px helvetica, arial, freesans, clean, sans-serif; colo ... 
- Hadoop集群搭建(非HA)
			1.准备Linux环境 1.0先将虚拟机的网络模式选为NAT 1.1修改主机名 vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=itcast ### ... 
- datagrid 添加、修改、删除(转载)
			原链接:JQueryEasyUI学习笔记(十)datagrid 添加.修改.删除 基于datagrid框架的删除.添加与修改: 主要是批量删除,双击表单修改.选中行修改,增加行修改,再有就是扩展edi ... 
- Oracle ORA-39726压缩表删除字段处理方法
			今天在往一个压缩表增加一个字段可以增加成功,但在删除的时候报了个ORA-39726 unsupported add/drop column operation on compressed tables ... 
- 使用JPA和Hibernate进行批量处理的最佳方式
			Tips 原文作者:Vlad Mihalcea 原文地址:The best way to do batch processing with JPA and Hibernate 在本文中,你将了解什么是 ... 
