原創: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.
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?- package Test;
- import java.io.Serializable;
- publicclass Student implements Serializable {//實現序列化介面...必須
- privateint id;
- private String name;
- publicint getId() {
- return id;
- }
- publicvoid setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return id + "=" + name;
- }
- }
- package Test;
- import java.io.Serializable;
- import java.util.List;
- publicclass ListTest implements Serializable {//實現序列化介面...必須
- private List<Student> list;
- public List<Student> getList() {
- return list;
- }
- publicvoid setList(List<Student> list) {
- this.list = list;
- }
- }
下面是簡單的Socket傳輸測試:
服務端:
[java] view plain copy print?- 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;
- publicclass 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
- publicvoid 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();
- }
- }
- publicstaticvoid main(String[] args) {
- new Server().start();
- }
- }
客戶端:
[java] view plain copy print?- package Test;
- import java.io.ObjectInputStream;
- import java.net.Socket;
- import java.util.List;
- publicclass Client {
- publicstaticvoid main(String[] args) {
- try {
- Socket socket = new Socket("127.0.0.1",9000);
- ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
- //進行Object傳輸可以使用ObjectInputStream
- ListTest test = (ListTest) in.readObject();
- List<Student> list = test.getList();
- for (Student student : list) {
- System.out.println(student.getName());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
其中的兩個封裝類必須實現序列化介面!!!