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

项目技术: 

1. socket通信

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

参考:

1.2 socket可以保持多客户端同时在线,易于维护。 http需轮询。 参考两者的差别:

java.lang.ClassNotFoundException 原因是 客户端和服务端传递的对象所在包的路径不一致

2.Android客户端

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

putExtra (String name, Serializable value),务必注意数据要序列化; --》参考:,注意在AndroidManifest文件里面,注册activity。

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

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

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

3. 服务器端

3.1 服务端的sqlite,采用的下载包:org.sqlite.JDBC ,可参考

synchronized是为了给该对象上锁,加static目的是变成静态方法, 同一时间,只能接受一个对象访问该方法,且是静态访问,其他对象也被上锁。

//当前时间 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

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

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<Student> list;  
9.   
10. public List<Student> getList() {  
11. return list;  
12.     }  
13.   
14. public void setList(List<Student> list) {  
15. this.list = list;  
16.     }  
17.       
18. }


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

服务端:

    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. new ServerSocket(9000);  
    18.             socket = server.accept();  
    19. catch (Exception e) {  
    20. "start error");  
    21.         }  
    22.     }  
    23. @Override  
    24. public void run() {  
    25. try {  
    26. new Student();  
    27. 1);  
    28. "name1");  
    29. new Student();  
    30. 1);  
    31. "name2");  
    32. new ArrayList<Student>();  
    33.             list.add(stu);  
    34.             list.add(stu1);  
    35.               
    36. new ListTest();  
    37.             test.setList(list);  
    38.               
    39.               
    40. 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. }


    客户端:


    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. new Socket("127.0.0.1",9000);  
    11. new ObjectInputStream(socket.getInputStream());  
    12. //进行Object传输可以使用ObjectInputStream  
    13.             ListTest test = (ListTest) in.readObject();  
    14.             List<Student> 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. }


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