项目背景: Android的sqlite数据库,需要上传服务器,进行更新保存;

项目技术: 

1. socket通信

1.1 服务器与客户端均采用多线程(必须的,因Android UI里面进行网络数据请求的时候,socket不能在主线程);

参考:http://blog.csdn.net/x605940745/article/details/17001641

1.2 socket可以保持多客户端同时在线,易于维护。 http需轮询。 参考两者的差别:http://blog.csdn.net/ljp12345/article/details/52120828

1.3 socket传递Object对象时,必须注意,包名必须一致, 另外,必须保证Object全部被序列化!否则易出错,java.lang.ClassNotFoundException 原因是 客户端和服务端传递的对象所在包的路径不一致


2.Android客户端

2.1 定义Handler, 用于socket子线程回传数据,UI刷新;

2.2 利用Intent,用于两个activity之间的结构化数据传输,Intent.putExtra (String name, Serializable value),务必注意数据要序列化; --》参考:http://blog.csdn.net/codezjx/article/details/8876753,注意在AndroidManifest文件里面,注册activity。

2.3 利用Arraylist,对数据表的每一行数据,进行存储;

2.4 数据库的显示技术,用到了listView技术;

2.5 数据库查询,直接sqlite包里面的query方法,得到cursor,可进行遍历;


3. 服务器端

3.1 服务端的sqlite,采用的下载包:org.sqlite.JDBC ,可参考http://blog.csdn.net/ljp12345/article/details/52131631

3.2 对数据库的任何更新操作,均采用了synchronized static 方法,加synchronized是为了给该对象上锁,加static目的是变成静态方法, 同一时间,只能接受一个对象访问该方法,且是静态访问,其他对象也被上锁。

3.3 读取系统时间,并格式化。  //当前时间 Date day=new Date();  SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_HHmmss");

3.4  JDBC数据库的更新时,默认是autoCommit, 为保证安全,可以先禁止掉,用prepareStatement代替createStatement。如:

//1. Obtain connection and set `false` to autoCommit
c = DriverManager.getConnection("jdbc:sqlite:"+dbFileName);
  c.setAutoCommit(false);        
  //2. Prepare and execute statements
        statement1=c.prepareStatement(sql);
//3. Execute the statements
statement1.executeUpdate();
        //4. Commit the changes
 c.commit();


以下为示例转载:Socket传输List数据


在进行Android程序开发时,有需求将服务器(PC)的数据库数据在android客户端显示,通过网络或Socket进行数据的传输,一般的SOCKET数据传输都是以流媒体进行传输,一把从服务器查询的数据类型经过面向对象的封装成Object,所以,一般都将数据转换成JSON或者XML进行传输,android程序进行解析显示,但也可以通过ObjectInputStream,ObjectOutputStream通过Socket传输,下面为代码:

数据的封装类:Student.java

[java]  view plain  copy  print ?
  1. package Test;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Student implements Serializable {//实现序列化接口...必须  
  6.     private int id;  
  7.     private String name;  
  8.   
  9.     public int getId() {  
  10.         return id;  
  11.     }  
  12.   
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.   
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.   
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.   
  25.     @Override  
  26.     public String toString() {  
  27.         // TODO Auto-generated method stub  
  28.         return id + "=" + name;  
  29.     }  
  30. }  


 

还有一个集合类的封装:ListTest.java [java]  view plain  copy  print ?
  1. package Test;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. public class ListTest implements Serializable {//实现序列化接口...必须  
  7.   
  8.     private List list;  
  9.   
  10.     public List getList() {  
  11.         return list;  
  12.     }  
  13.   
  14.     public void setList(List list) {  
  15.         this.list = list;  
  16.     }  
  17.       
  18. }  

下面是简单的Socket传输测试:

服务端:

[java]  view plain  copy  print ?
  1. package Test;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.ObjectInputStream;  
  5. import java.io.ObjectOutputStream;  
  6. import java.net.ServerSocket;  
  7. import java.net.Socket;  
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10.   
  11. public class Server extends Thread {  
  12.     private ServerSocket server;  
  13.     private Socket socket;  
  14.       
  15.     public Server(){  
  16.         try {  
  17.             server = new ServerSocket(9000);  
  18.             socket = server.accept();  
  19.         } catch (Exception e) {  
  20.             System.out.println("start error");  
  21.         }  
  22.     }  
  23.     @Override  
  24.     public void run() {  
  25.         try {  
  26.             Student stu = new Student();  
  27.             stu.setId(1);  
  28.             stu.setName("name1");  
  29.             Student stu1 = new Student();  
  30.             stu1.setId(1);  
  31.             stu1.setName("name2");  
  32.             List list = new ArrayList();  
  33.             list.add(stu);  
  34.             list.add(stu1);  
  35.               
  36.             ListTest test = new ListTest();  
  37.             test.setList(list);  
  38.               
  39.               
  40.             ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());  
  41.             out.writeObject(test);  
  42.             out.flush();  
  43.             out.close();  
  44.             socket.close();  
  45.         } catch (Exception e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.     }  
  49.       
  50.     public static void main(String[] args) {  
  51.         new Server().start();  
  52.     }  
  53. }  

客户端:

[java]  view plain  copy  print ?
  1. package Test;  
  2.   
  3. import java.io.ObjectInputStream;  
  4. import java.net.Socket;  
  5. import java.util.List;  
  6.   
  7. public class Client {  
  8.     public static void main(String[] args) {  
  9.         try {  
  10.             Socket socket = new Socket("127.0.0.1",9000);  
  11.             ObjectInputStream in = new ObjectInputStream(socket.getInputStream());  
  12.             //进行Object传输可以使用ObjectInputStream  
  13.             ListTest test = (ListTest) in.readObject();  
  14.             List list = test.getList();  
  15.             for (Student student : list) {  
  16.                 System.out.println(student.getName());  
  17.             }  
  18.         } catch (Exception e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22. }  

其中的两个封装类必须实现序列化接口!!!

更多相关文章

  1. Android小例子(点击一个按钮,传递数据给另一个页面)
  2. 解决Android横竖屏切换数据丢失问题的方法
  3. Android greenDao数据库的简单使用(一)
  4. Android访问中央气象台的天气预报API得到天气数据 .
  5. Android开发便签6:数据保存之File存储
  6. 8.1、Android中为Intent附加数据的两种写法
  7. Android中数据库操作框架greenDAO介绍与使用
  8. Android系列之Intent传递对象的两种方法
  9. Android 基础-3.0 数据存储方式

随机推荐

  1. Rooting Android
  2. android out of memory(OOM)
  3. android WebView解析 调用html5页面
  4. 4种必须知道的Android屏幕自适应解决方案
  5. Android studio 简单的多线程
  6. Android(安卓)framework——Activity的启
  7. Android中对后台任务线程性能的说明及优
  8. Android: Launch the HOME screen
  9. Android Battery一些信息获取方法
  10. Android单选按钮组(RadioGroup)的用法