【问题标题】:Why can't connect Android App with Oracle database?为什么Android App无法连接Oracle数据库?
【发布时间】:2013-06-01 15:26:41
【问题描述】:

我在项目的libs文件夹中添加了ojdbc14.jar和oraclepki.jar,这里是android项目的MainActivity.java:

package com.example.testoracle;

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;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            String userName = getDataFromOraDB();
            TextView tv = new TextView(this);
            tv.setText("Here is the name : "+userName);
            setContentView(tv);
            } catch (SQLException e) {
            Toast.makeText(this, "1st toast : "+e.getMessage(), Toast.LENGTH_LONG).show();
            } catch (ClassNotFoundException e) {
            Toast.makeText(this, "second toast : "+e.getMessage(), Toast.LENGTH_LONG).show();
            }
    }

    public String getDataFromOraDB() throws SQLException,
    ClassNotFoundException {
        String name = null;
        String jdbcURL = "jdbc:oracle:thin:@//localhost:1521:oracl";
        String user = "SYSTEM";
        String passwd = "root";
        // Load the Oracle JDBC driver

        try {
            Log.w("MyApp","Try");
            DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
            Connection conn;
            ResultSet rs;
            Statement stmt;
            conn = DriverManager.getConnection(jdbcURL, user, passwd);
            stmt = conn.createStatement();
            Log.w("MyApp","Avant query");
            rs = stmt.executeQuery("select Name from table_people");
            Log.w("MyApp","Apres query");
            if (rs.next()) {
                name = rs.getString("Name");
            }
        } catch (java.sql.SQLException e) {
            // Auto-generated catch block
            System.out.println("the exception is : " + e.toString());
        }

        Toast.makeText(getApplicationContext(), "3rd toast : "+name, Toast.LENGTH_LONG).show();
        return name;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

清单确实有 INTERNET 许可

<uses-permission android:name="android.permission.INTERNET" />

这是我在 logcat 中得到的内容

06-01 15:16:34.142: W/MyApp(402): Try
06-01 15:16:34.373: I/dalvikvm(402): Failed resolving Loracle/jdbc/xa/OracleXAResource; interface 927 'Ljavax/transaction/xa/XAResource;'
06-01 15:16:34.373: W/dalvikvm(402): Link of class 'Loracle/jdbc/xa/OracleXAResource;' failed
06-01 15:16:34.373: W/dalvikvm(402): Unable to resolve superclass of Loracle/jdbc/xa/client/OracleXAResource; (1341)
06-01 15:16:34.373: W/dalvikvm(402): Link of class 'Loracle/jdbc/xa/client/OracleXAResource;' failed
06-01 15:16:34.373: W/dalvikvm(402): Unable to resolve superclass of Loracle/jdbc/driver/T4CXAResource; (1348)
06-01 15:16:34.373: W/dalvikvm(402): Link of class 'Loracle/jdbc/driver/T4CXAResource;' failed
06-01 15:16:34.373: W/dalvikvm(402): VFY: unable to find class referenced in signature (Loracle/jdbc/driver/T4CXAResource;)
06-01 15:16:34.373: I/dalvikvm(402): Failed resolving Loracle/jdbc/xa/OracleXAResource; interface 927 'Ljavax/transaction/xa/XAResource;'
06-01 15:16:34.383: W/dalvikvm(402): Link of class 'Loracle/jdbc/xa/OracleXAResource;' failed
06-01 15:16:34.383: W/dalvikvm(402): Unable to resolve superclass of Loracle/jdbc/xa/client/OracleXAResource; (1341)
06-01 15:16:34.383: W/dalvikvm(402): Link of class 'Loracle/jdbc/xa/client/OracleXAResource;' failed
06-01 15:16:34.383: W/dalvikvm(402): Unable to resolve superclass of Loracle/jdbc/driver/T4CXAResource; (1348)
06-01 15:16:34.383: W/dalvikvm(402): Link of class 'Loracle/jdbc/driver/T4CXAResource;' failed
06-01 15:16:34.383: I/dalvikvm(402): Could not find method oracle.jdbc.driver.T4CXAResource.setPasswordInternal, referenced from method oracle.jdbc.driver.T4CConnection.getPasswordInternal
06-01 15:16:34.383: W/dalvikvm(402): VFY: unable to resolve virtual method 10574: Loracle/jdbc/driver/T4CXAResource;.setPasswordInternal (Ljava/lang/String;)V
06-01 15:16:34.533: I/dalvikvm(402): Failed resolving Loracle/jdbc/pool/OracleDataSource; interface 850 'Ljavax/naming/Referenceable;'
06-01 15:16:34.533: W/dalvikvm(402): Link of class 'Loracle/jdbc/pool/OracleDataSource;' failed
06-01 15:16:34.533: I/dalvikvm(402): Could not find method oracle.jdbc.pool.OracleDataSource.filterConnectionProperties, referenced from method oracle.jdbc.driver.PhysicalConnection.getProperties
06-01 15:16:34.533: W/dalvikvm(402): VFY: unable to resolve static method 11805: Loracle/jdbc/pool/OracleDataSource;.filterConnectionProperties (Ljava/util/Properties;)Ljava/util/Properties;
06-01 15:16:34.543: W/dalvikvm(402): VFY: unable to find class referenced in signature (Ljavax/transaction/xa/XAResource;)
06-01 15:16:35.192: I/System.out(402): the exception is : java.sql.SQLException: Io exception: The Network Adapter could not establish the connection

那么有没有办法避免“网络适配器无法建立连接”?

【问题讨论】:

  • 尝试用机器的实际IP地址替换localhost。你是在模拟器上运行这个应用吗?
  • 我在 VMWARE FUSION 中安装在 Windows 7 上的模拟器上运行此应用
  • 那么首先要做的就是用系统的实际ip替换localhost。
  • 所以还是不行?
  • 是的,不行!!!

标签: java android database oracle jdbc


【解决方案1】:

这可能不是你想听到的,但是....

虽然您可以通过使用正确的数据库服务器地址并摆弄一些其他位来实现此功能,但您真的不应该这样做。

Oracle 是一种服务器端技术,而 Android 显然是一种客户端。 大多数理智的人在很多年前就停止使用这种客户端-服务器数据库访问,原因很充分......现在这几乎是一个怀旧的笑话。

恕我直言,您应该使用您选择的语言构建一个服务器应用程序,为您的 Android 应用程序提供基于 HTTP 的 API(XML、JSON 等)。

然后,直接从您的 Android 应用程序使用 API,或者使用 API 使您的 Android 本地 sqlite 数据库与 Oracle 数据库的某个子集保持同步。

您最喜欢的网络搜索引擎提供了很多同时执行这两种操作的示例。

【讨论】:

  • 这总是正确的,除了有时(只是在特殊情况下,您的数据库和您的 android 设备将处于安全状态且仅由您或您的公司网络管理)不需要 Web 服务,但如果不是这样,@GreyBeardedGeek 在这里所说的绝对正确。
  • 嗯,这很可怕/悲伤。
【解决方案2】:

1.-检查您的 Oracle 数据库是否已启动并运行。

2.- 如果正在运行,请检查您的连接字符串是否正确,并根据数据库信息更改您的连接字符串。 a) 转到您的本地主机:https://localhost:1158/em b) 登录 用户名 密码 连接为 --> 正常 c) 在“General”下方点击 LISTENER_localhost 看看你的端口号

Net Address (ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1522)) Connect to port 1522 

3.-检查是否有防火墙。

由于 android 会进行网络调用,你不应该在主线程中这样做,使用线程或 AsyncTask 进行连接。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多