1. 程式人生 > >原創:Android的sqlite資料庫需上傳伺服器,進行更新儲存

原創:Android的sqlite資料庫需上傳伺服器,進行更新儲存

專案背景: 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

[java] view plain copy  print?
  1. package Test;  
  2. import java.io.Serializable;  
  3. publicclass Student implements Serializable {//實現序列化介面...必須
  4.     privateint id;  
  5.     private String name;  
  6.     publicint getId() {  
  7.         return id;  
  8.     }  
  9.     publicvoid setId(int id) {  
  10.         this.id = id;  
  11.     }  
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.     publicvoid setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.     @Override
  19.     public String toString() {  
  20.         // TODO Auto-generated method stub
  21.         return id + "=" + name;  
  22.     }  
  23. }  
還有一個集合類的封裝:ListTest.java [java] view plain copy  print?
  1. package Test;  
  2. import java.io.Serializable;  
  3. import java.util.List;  
  4. publicclass ListTest implements Serializable {//實現序列化介面...必須
  5.     private List<Student> list;  
  6.     public List<Student> getList() {  
  7.         return list;  
  8.     }  
  9.     publicvoid setList(List<Student> list) {  
  10.         this.list = list;  
  11.     }  
  12. }  

下面是簡單的Socket傳輸測試:

服務端:

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

客戶端:

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

其中的兩個封裝類必須實現序列化介面!!!