下載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。
一、Android平臺下與服務器數據庫通訊的方法html
在Android平臺下,鏈接電腦服務器的MySQL、PostgreSQL、Oracle、Sybase、Microsoft SQLServer等數據庫管理系統DBMS(database management system),主要有如下兩種方法:java
方法一、直接鏈接mysql
在Android工程中引入JDBC驅動,直接鏈接。(本文主要介紹此種方法)android
方法二、間接鏈接sql
在服務器上用PHP+DBMS作服務器端,PHP將DBMS中的數據用json或者xml進行封裝。而後再發封裝好的數據返回給Android平臺。數據庫
注意:json
採用JDBC方法主要問題是安全性不高,並且一旦要訪問的數據量過多,容易出問題。另外,Android系統自己有對json或者xml直接解析的api,因此建議採用第二種方法,實用性與安全性都提升了。windows
二、JDBC簡介api
JDBC是Java Data Base Connectivity的縮寫,意思爲「java數據庫鏈接」,由一組用Java語言編寫的類和接口組成,爲java層直接操做關係型數據庫提供了標準的API。原理很簡單,主要是先服務器DBMS發送SQL(結構化查詢語言)指令。實現各類數據庫的操做。安全
三、如何在Android中使用JDBC與服務器數據庫通訊
在Android工程使用JDBC鏈接數據庫的主要步驟以下:
3.一、加載JDBC驅動程序
在Android工程中要使用JDBC的話,要導入JDBC的驅動。
詳細過程:
在eclipse選擇工程,右鍵---->Properties---->在左側選項「Java Build Path」---->切換到「Libraries」---->選擇「Add External JARs」---->選中jtds的jar包---->完畢
而後在java代碼的開始處 import JDBC的包,這一步根據不一樣的驅動,目錄可能不同,找到Driver的路徑便可。
接下來在java代碼中使用如下語句,加載jdbc驅動。
注意: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種)
//1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar Connection con = null; Class.forName( "org.gjt.mm.mysql.Driver" );// 加載驅動程序 con = DriverManager.getConnection( "jdbc:mysql://DbComputerNameOrIPAddr:3306/DatabaseName", UserName, Password ); //2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar Connection con = null; Class.forName( "org.postgresql.Driver" );// 加載驅動程序 con = DriverManager.getConnection( "jdbc:postgresql://DbComputerNameOrIPAddr/DatabaseName", UserName, Password ); //3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip Connection con = null; Class.forName( "oracle.jdbc.driver.OracleDriver" );// 加載驅動程序 con = DriverManager.getConnection( "jdbc:oracle:thin:@DbComputerNameOrIPAddr:1521:DatabaseName", UserName, Password ); //4. Sybase(http://jtds.sourceforge.net)jconn2.jar Connection con = null; Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );// 加載驅動程序 con = DriverManager.getConnection( "jdbc:sybase:Tds:DbComputerNameOrIPAddr:2638/DatabaseName", UserName, Password ); //(Default-Username/Password: "dba"/"sql") //5. Microsoft SQLServer(http://jtds.sourceforge.net) Connection con = null; Class.forName( "net.sourceforge.jtds.jdbc.Driver" );// 加載驅動程序 con = DriverManager.getConnection( "jdbc:jtds:sqlserver://DbComputerNameOrIPAddr:1433/DatabaseName", UserName, Password ); //6. Microsoft SQLServer(http://www.microsoft.com) Connection con = null; Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );// 加載驅動程序 con = DriverManager.getConnection( "jdbc:microsoft:sqlserver://DbComputerNameOrIPAddr:1433;databaseName=master", UserName, Password );
3.三、發送SQL語句
當成功鏈接數據庫以後,就能夠發送操做數據庫的語句並處理結果了。
在發送SQL語句以前,首先要建立一個Statement對象,Statement主要工做是把 SQL 語句發送給 DBMS 。
而後發送SQL語句。對於SELECT操做,使用的是Statement對象的executeQuery(sql)方法,對於一些建立table和修改table的操做,使用的是Statement對象的executeUpdate(sql)方法。
如:
四、簡單demo程序
因爲要聯網,因此要在AndroidManifest.xml裏面加入鏈接網絡的權限:
完整的AndroidManifest.xml以下所示:
鏈接到Microsoft SQL Server,而後後臺System.out.println輸出結果:
結果圖:
* date:2012.4.7 * Android_connect_sqlserverActivity */ package com.conowen.sqlserver; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import android.app.Activity; import android.database.SQLException; import android.os.Bundle; public class Android_connect_sqlserverActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String UserName = "test";//用戶名 String Password = "test";//密碼 Connection con = null; try { // 加載驅動程序 Class.forName("net.sourceforge.jtds.jdbc.Driver"); con = DriverManager.getConnection( "jdbc:jtds:sqlserver://192.168.1.2:1433/testDB", UserName, Password); } catch (ClassNotFoundException e) { System.out.println("加載驅動程序出錯"); } catch (SQLException e) { System.out.println(e.getMessage()); } catch (Exception e) { System.out.println(e.getMessage()); } try { testConnection(con);//測試數據庫鏈接 } catch (java.sql.SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void testConnection(Connection con) throws java.sql.SQLException { try { String sql = "SELECT * FROM table_test";//查詢表名爲「table_test」的全部內容 Statement stmt = con.createStatement();//建立Statement ResultSet rs = stmt.executeQuery(sql);//ResultSet相似Cursor while (rs.next()) {//<code>ResultSet</code>最初指向第一行 System.out.println(rs.getString("test_id"));//輸出第n行,列名爲「test_id」的值 System.out.println(rs.getString("test_name")); } rs.close(); stmt.close(); } catch (SQLException e) { System.out.println(e.getMessage().toString()); } finally { if (con != null) try { con.close(); } catch (SQLException e) { } } } }