1、Android平台下与服务器数据库通信的方法
在Android平台下,连接电脑服务器的MySQL、PostgreSQL、Oracle、Sybase、Microsoft SQLServer等数据库管理系统DBMS(database management system),主要有以下两种方法:
方法1、直接连接
在Android工程中引入JDBC驱动,直接连接。(本文主要介绍此种方法)
方法2、间接连接
在服务器上用PHP+DBMS做服务器端,PHP将DBMS中的数据用json或者xml进行封装。然后再发封装好的数据返回给Android平台。
注意:
采用JDBC方法主要问题是安全性不高,而且一旦要访问的数据量过多,容易出问题。另外,Android系统本身有对json或者xml直接解析的api,所以建议采用第二种方法,实用性与安全性都提高了。
2、JDBC简介
JDBC是Java Data Base Connectivity的缩写,意思为“java数据库连接”,由一组用Java语言编写的类和接口组成,为java层直接操作关系型数据库提供了标准的API。原理很简单,主要是先服务器DBMS发送SQL(结构化查询语言)指令。实现各种数据库的操作。
3、如何在Android中使用JDBC与服务器数据库通信
在Android工程使用JDBC连接数据库的主要步骤如下:
加载JDBC驱动程序------->建立连接--------->发送SQL语句
3.1、加载JDBC驱动程序
在Android工程中要使用JDBC的话,要导入JDBC的驱动。
详细过程:
在eclipse选择工程,右键---->Properties---->在左侧选项“Java Build Path”---->切换到“Libraries”---->选择“Add External JARs”---->选中jtds的jar包---->完毕
然后在java代码的开始处 import JDBC的包,这一步根据不同的驱动,目录可能不一样,找到Driver的路径即可。
1 import net.sourceforge.jtds.jdbc.Driver;
接下来在java代码中使用以下语句,加载jdbc驱动。
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.2、建立连接
每种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 //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
3.3、发送SQL语句
当成功连接数据库之后,就可以发送操作数据库的语句并处理结果了。
在发送SQL语句之前,首先要创建一个Statement对象,Statement主要工作是把 SQL 语句发送给 DBMS 。
1 Statement stmt = con.createStatement();//创建Statement
然后发送SQL语句。对于SELECT操作,使用的是Statement对象的executeQuery(sql)方法,对于一些创建table和修改table的操作,使用的是Statement对象的executeUpdate(sql)方法。
如:
1 String sql = "SELECT * FROM table_test";//查询表名为“table_test”的所有内容 2 Statement stmt = con.createStatement();//创建Statement 3 ResultSet rs = stmt.executeQuery(sql);
4、简单demo程序
由于要联网,所以要在AndroidManifest.xml里面加入连接网络的权限:
1 <uses-permission android:name="android.permission.INTERNET" />
完整的AndroidManifest.xml如下所示:
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输出结果:
结果图:
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 }
参考原文:http://blog.csdn.net/yyh1988923/article/details/8657184