项目背景: 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<Object>,对数据表的每一行数据,进行存储;
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<Object>数据
在进行Android程序开发时,有需求将服务器(PC)的数据库数据在android客户端显示,通过网络或Socket进行数据的传输,一般的SOCKET数据传输都是以流媒体进行传输,一把从服务器查询的数据类型经过面向对象的封装成Object,所以,一般都将数据转换成JSON或者XML进行传输,android程序进行解析显示,但也可以通过ObjectInputStream,ObjectOutputStream通过Socket传输,下面为代码:
数据的封装类:Student.java
- package Test;
-
- import java.io.Serializable;
-
- public class Student implements Serializable {
- private int id;
- private String name;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public String toString() {
-
- return id + "=" + name;
- }
- }
还有一个集合类的封装:ListTest.java
- package Test;
-
- import java.io.Serializable;
- import java.util.List;
-
- public class ListTest implements Serializable {
-
- private List<Student> list;
-
- public List<Student> getList() {
- return list;
- }
-
- public void setList(List<Student> list) {
- this.list = list;
- }
-
- }
下面是简单的Socket传输测试:
服务端:
- package Test;
-
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.List;
-
- public class Server extends Thread {
- private ServerSocket server;
- private Socket socket;
-
- public Server(){
- try {
- server = new ServerSocket(9000);
- socket = server.accept();
- } catch (Exception e) {
- System.out.println("start error");
- }
- }
- @Override
- public void run() {
- try {
- Student stu = new Student();
- stu.setId(1);
- stu.setName("name1");
- Student stu1 = new Student();
- stu1.setId(1);
- stu1.setName("name2");
- List<Student> list = new ArrayList<Student>();
- list.add(stu);
- list.add(stu1);
-
- ListTest test = new ListTest();
- test.setList(list);
-
-
- ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
- out.writeObject(test);
- out.flush();
- out.close();
- socket.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public static void main(String[] args) {
- new Server().start();
- }
- }
客户端:
- package Test;
-
- import java.io.ObjectInputStream;
- import java.net.Socket;
- import java.util.List;
-
- public class Client {
- public static void main(String[] args) {
- try {
- Socket socket = new Socket("127.0.0.1",9000);
- ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
-
- ListTest test = (ListTest) in.readObject();
- List<Student> list = test.getList();
- for (Student student : list) {
- System.out.println(student.getName());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
其中的两个封装类必须实现序列化接口!!!