Android平臺下與服務器數據庫通訊的方法

一、Android平臺下與服務器數據庫通訊的方法html


        在Android平臺下,鏈接電腦服務器的MySQL、PostgreSQL、Oracle、Sybase、Microsoft SQLServer等數據庫管理系統DBMS(database management system),主要有如下兩種方法:
java


方法一、直接鏈接mysql

在Android工程中引入JDBC驅動,直接鏈接。(本文主要介紹此種方法)
android

 

方法二、間接鏈接web

在服務器上用PHP+DBMS作服務器端,PHP將DBMS中的數據用json或者xml進行封裝。而後再發封裝好的數據返回給Android平臺。sql


注意:數據庫

        採用JDBC方法主要問題是安全性不高,並且一旦要訪問的數據量過多,容易出問題。另外,Android系統自己有對json或者xml直接解析的api,因此建議採用第二種方法,實用性與安全性都提升了。json


二、JDBC簡介windows

       JDBC是Java Data Base Connectivity的縮寫,意思爲「java數據庫鏈接」,由一組用Java語言編寫的類和接口組成,爲java層直接操做關係型數據庫提供了標準的API。原理很簡單,主要是先服務器DBMS發送SQL(結構化查詢語言)指令。實現各類數據庫的操做。api


三、如何在Android中使用JDBC與服務器數據庫通訊


在Android工程使用JDBC鏈接數據庫的主要步驟以下:

加載JDBC驅動程序------->創建鏈接--------->發送SQL語句


3.一、加載JDBC驅動程序

     在Android工程中要使用JDBC的話,要導入JDBC的驅動。


 詳細過程:

在eclipse選擇工程,右鍵---->Properties---->在左側選項「Java Build Path」---->切換到「Libraries」---->選擇「Add External JARs」---->選中jtds的jar包---->完畢


而後在java代碼的開始處 import JDBC的包,這一步根據不一樣的驅動,目錄可能不同,找到Driver的路徑便可。

[java]  view plain copy
<EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. import net.sourceforge.jtds.jdbc.Driver;  


 

接下來在java代碼中使用如下語句,加載jdbc驅動。

[java]  view plain copy
<EMBED id=ZeroClipboardMovie_2 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. Class.forName("net.sourceforge.jtds.jdbc.Driver");// 加載驅動程序  


 

注意:ADT版本和android-sdk_Tools最好爲16,我試過版本20總是出現找不到驅動的問題。

降級方法:

離線安裝ADT


下載SDK Tools

添加下載任務

http://dl.google.com/android/installer_r16-windows.exe

下載完畢以後,安裝到一個任意位置,而後把裏面的文件和文件夾copy到以前的sdk tools目錄,覆蓋新版本的。而後從eclipse裏面打開 Android Sdk Manager,而後在第一項的tools裏面,再勾選Android SDK Platform-tools就好了,記得不要勾選Android SDK Tool。


 

3.二、創建鏈接

      每種DBMS的JDBC驅動是不同的,同一個DBMS也會有幾種JDBC驅動,如Microsoft   SQL   Server的JDBC驅動主要有兩種,Microsoft  官方提供的JDBC驅動和民間開源的JDBC驅動(JTDS),推薦JTDS,bug少,並且是徹底開放源代碼的。目前JTDS只能支持Microsoft   SQL   Server和Sybase。

      因爲DBMS與JDBC驅動的不一樣,因此每種JDBC鏈接數據庫的字符串書寫方法也是不同的。

      下面給出幾種常見的JDBC與DBMS創建鏈接的字符串書寫格式,(本博文是JTDS鏈接msserver ,因此是第5種)

[java]  view plain copy
<EMBED id=ZeroClipboardMovie_3 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. //1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar  
  2. Connection con = null;  
  3. Class.forName( "org.gjt.mm.mysql.Driver" );// 加載驅動程序  
  4. con = DriverManager.getConnection( "jdbc:mysql://DbComputerNameOrIPAddr:3306/DatabaseName", UserName, Password );  
  5.   
  6.   
  7. //2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar  
  8. Connection con = null;  
  9. Class.forName( "org.postgresql.Driver" );// 加載驅動程序  
  10. con = DriverManager.getConnection( "jdbc:postgresql://DbComputerNameOrIPAddr/DatabaseName", UserName, Password );  
  11.   
  12.   
  13. //3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip  
  14. Connection con = null;  
  15. Class.forName( "oracle.jdbc.driver.OracleDriver" );// 加載驅動程序  
  16. con = DriverManager.getConnection( "jdbc:oracle:thin:@DbComputerNameOrIPAddr:1521:DatabaseName", UserName, Password );  
  17.   
  18.   
  19. //4. Sybase(http://jtds.sourceforge.net)jconn2.jar  
  20. Connection con = null;  
  21. Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );// 加載驅動程序  
  22. con = DriverManager.getConnection( "jdbc:sybase:Tds:DbComputerNameOrIPAddr:2638/DatabaseName", UserName, Password );  
  23. //(Default-Username/Password: "dba"/"sql")  
  24.   
  25.   
  26. //5. Microsoft SQLServer(http://jtds.sourceforge.net)  
  27. Connection con = null;  
  28. Class.forName( "net.sourceforge.jtds.jdbc.Driver" );// 加載驅動程序  
  29. con = DriverManager.getConnection( "jdbc:jtds:sqlserver://DbComputerNameOrIPAddr:1433/DatabaseName", UserName, Password );  
  30.   
  31.   
  32. //6. Microsoft SQLServer(http://www.microsoft.com)  
  33. Connection con = null;  
  34. Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );// 加載驅動程序  
  35. con = DriverManager.getConnection( "jdbc:microsoft:sqlserver://DbComputerNameOrIPAddr:1433;databaseName=master", UserName, Password );  


 


3.三、發送SQL語句


當成功鏈接數據庫以後,就能夠發送操做數據庫的語句並處理結果了。


在發送SQL語句前,首先要建立一個Statement對象,Statement主要工做是把 SQL 語句發送給 DBMS 。

[java]  view plain copy
<EMBED id=ZeroClipboardMovie_4 name=ZeroClipboardMovie_4 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=4&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. Statement stmt = con.createStatement();//建立Statement  


 

而後發送SQL語句對於SELECT操做,使用的是Statement對象的executeQuery(sql)方法,對於一些建立table和修改table的操做,使用的是Statement對象的executeUpdate(sql)方法。

如:

[java]  view plain copy
<EMBED id=ZeroClipboardMovie_5 name=ZeroClipboardMovie_5 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=5&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. String sql = "SELECT * FROM table_test";//查詢表名爲「table_test」的全部內容  
  2. Statement stmt = con.createStatement();//建立Statement  
  3. ResultSet rs = stmt.executeQuery(sql);  


四、簡單demo程序


因爲要聯網,因此要在AndroidManifest.xml裏面加入鏈接網絡的權限:

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_6 name=ZeroClipboardMovie_6 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=6&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. <uses-permission android:name="android.permission.INTERNET" />  


 

完整的AndroidManifest.xml以下所示:

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_7 name=ZeroClipboardMovie_7 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=7&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.conowen.sqlserver"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="9" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.         <activity  
  13.             android:label="@string/app_name"  
  14.             android:name=".Android_connect_sqlserverActivity" >  
  15.             <intent-filter >  
  16.                 <action android:name="android.intent.action.MAIN" />  
  17.   
  18.                 <category android:name="android.intent.category.LAUNCHER" />  
  19.             </intent-filter>  
  20.         </activity>  
  21.     </application>  
  22. <uses-permission android:name="android.permission.INTERNET" />  
  23. </manifest>  



 

鏈接到Microsoft SQL Server,而後後臺System.out.println輸出結果:

結果圖:


[java]  view plain copy
<EMBED id=ZeroClipboardMovie_8 name=ZeroClipboardMovie_8 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=8&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. /*author:conowen 
  2.  * date:2012.4.7 
  3.  * Android_connect_sqlserverActivity 
  4.  */  
  5. package com.conowen.sqlserver;  
  6.   
  7. import java.sql.Connection;  
  8. import java.sql.DriverManager;  
  9. import java.sql.ResultSet;  
  10. import java.sql.Statement;  
  11.   
  12. import android.app.Activity;  
  13. import android.database.SQLException;  
  14. import android.os.Bundle;  
  15.   
  16. public class Android_connect_sqlserverActivity extends Activity {  
  17.     /** Called when the activity is first created. */  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.         String UserName = "test";//用戶名  
  23.         String Password = "test";//密碼  
  24.         Connection con = null;  
  25.   
  26.         try { // 加載驅動程序  
  27.             Class.forName("net.sourceforge.jtds.jdbc.Driver");  
  28.             con = DriverManager.getConnection(  
  29.                     "jdbc:jtds:sqlserver://192.168.1.2:1433/testDB", UserName,  
  30.                     Password);  
  31.         } catch (ClassNotFoundException e) {  
  32.             System.out.println("加載驅動程序出錯");  
  33.         } catch (SQLException e) {  
  34.             System.out.println(e.getMessage());  
  35.         } catch (Exception e) {  
  36.             System.out.println(e.getMessage());  
  37.   
  38.         }  
  39.         try {  
  40.             testConnection(con);//測試數據庫鏈接  
  41.         } catch (java.sql.SQLException e) {  
  42.             // TODO Auto-generated catch block  
  43.             e.printStackTrace();  
  44.         }  
  45.     }  
  46.   
  47.     public void testConnection(Connection con) throws java.sql.SQLException {  
  48.   
  49.         try {  
  50.   
  51.             String sql = "SELECT * FROM table_test";//查詢表名爲「table_test」的全部內容  
  52.             Statement stmt = con.createStatement();//建立Statement  
  53.             ResultSet rs = stmt.executeQuery(sql);//ResultSet相似Cursor  
  54.   
  55.             while (rs.next()) {//<code>ResultSet</code>最初指向第一行  
  56.                 System.out.println(rs.getString("test_id"));//輸出第n行,列名爲「test_id」的值  
  57.                 System.out.println(rs.getString("test_name"));  
  58.                   
  59.             }  
  60.   
  61.             rs.close();  
  62.             stmt.close();  
  63.         } catch (SQLException e) {  
  64.             System.out.println(e.getMessage().toString());  
  65.         } finally {  
  66.             if (con != null)  
  67.                 try {  
  68.                     con.close();  
  69.                 } catch (SQLException e) {  
  70.                 }  
  71.         }  
  72.     }  
  73. }  
相關文章
相關標籤/搜索