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管理用 ...
 
随机推荐
- C语言之字符串
			
什么是字符串:使用双引号包含的字符序列. 简单的字符串"hello world" 一个'h'是一个字符 很多个字符组合在一起就是字符串了 字符串与字符数组 在C语言中没有专门的字符 ...
 - 小K的H5之旅-HTML5与CSS3部分新属性浅见
			
一.HTML部分 1.HTML5新特点 向下兼容.用户至上.化繁为简.无插件范式.访问通用性.引入语义.引入原生媒体支持.引入可编程内容 2.HTML5标签语法 可以省略的元素:空元素语法的元素{br ...
 - mysql之 mysql 5.6不停机双主一从搭建(活跃双主一从基于日志点复制)
			
环境说明:版本 version 5.6.25-log 主1库ip: 10.219.24.25主2库ip: 10.219.24.22从1库ip:10.219.24.26os 版本: centos 6.7 ...
 - android设计,图标等概述
			
作者:郦橙 锦妖 链接:https://www.zhihu.com/question/36813390/answer/87029428 著作权归作者所有,转载请联系作者获得授权. 简单复制,用于记录, ...
 - ionic2新手入门整理,搭建环境,创建demo,打包apk,热更新,优化启动慢等避坑详解
			
onic官方文档链接:http://ionicframework.com/docs/ 如果是新的环境会有很多坑,主要是有墙,请仔细阅读每个步骤 文档包含以下内容: l 环境搭建 l 创建demo并 ...
 - RabbitMQ分布式消息队列服务器(一、Windows下安装和部署)
			
RabbitMQ消息队列服务器在Windows下的安装和部署-> 一.Erlang语言环境的搭建 RabbitMQ开源消息队列服务是使用Erlang语言开发的,因此我们要使用他就必须先进行Erl ...
 - 在Caffe添加Python layer详细步骤
			
本文主要讨论的是在caffe中添加python layer的一般流程,自己设计的test_python_layer.py层只是起到演示作用,没有实际的功能. 1) Python layer 在caff ...
 - Mac 上Python多版本切换
			
Mac上自带了Python2.x的版本,有时需要使用Python3.x版本做开发,但不能删了Python2.x,可能引起系统不稳定,那么就需要安装多个版本的Python. 1.安装Python3.x版 ...
 - CSS常用Hack集合(adding)
			
1> IE9 and IE10 @media screen and (min-width: 0\0) { .p-form input.p-value[type="checkbox&qu ...
 - Python的多线程编程
			
提到多线程,很多人就会望而却步,本文将由浅入深地带你攻克python多线程编程,并防止你跳入深坑, 首先看一段简单的代码: from time import ctime,sleep def play_ ...