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管理用 ...
随机推荐
- SVN如何迁移到Git?
最近在使用华为软件开发云进行开发项目管理,目前华为软件开发云支持500M的免费项目空间,而且还可以在线编译和构建,不用担心开发环境和生产环境的不同,很好的体现了DevOps的开发理念. 之前一直是用s ...
- Git添加远程库和从远程库中获取(新手傻瓜式教学)
一. Git添加远程库 1.在本地新建一个文件夹,在该文件夹使用Git工具,运行$ git init,将该文件夹变为本地Git仓库,同时会生成一个隐藏的.git文件夹. 2.在该文件夹中用Not ...
- Django学习报错记录
1. 运行manage.py任务 makemigrations时,报错: doesn't declare an explicit app_label and isn't in an applicat ...
- 彻底清除Linux centos minerd木马
前几天,公司两台linux服务器,一台访问速度很慢,cpu跑满,一台免密码登录失效,公钥文件被改写成redis的key.用htop命令查询发现了minerd木马进程,初步猜测是redis没有配访问权限 ...
- source install sshpass in aix
1.源码下载: wget https://nchc.dl.sourceforge.net/project/sshpass/sshpass/1.06/sshpass-1.06.tar.gz 2.解压 ...
- Flex 布局:语法篇
网页布局(layout)是 CSS 的一个重点应用.布局的传统解决方案,基于盒状模型,依赖 display 属性 + position 属性 + float 属性.它对于那些特殊布局非常不方便,比如, ...
- JQuery--Ajax 异步操作 动态添加节点 (新人试水,求支持)
异步操作动态添加节点,导致在代码中给添加的节点全局绑定事件或者获取元素无效,上代码: $(function () { var IP = '...'; // 页面中的默认编号起始值 和 公用IP前缀 s ...
- JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表
一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public ...
- java数据结构(二叉树)
Node节点: public class Node { public long data; public String sData; public Node leftChild; public Nod ...
- DOUAudioStreamer 中kqueue的应用
DOUAudioStreamer是一个基于Core Audio的流式音频播放器,其中的DOUAudioEventLoop通过kqueue来控制音频的各种状态. kqueue简介(详情请看官方manua ...