无法在 Android 上使用 JDBC 连接到 Oracle 11g 数据库

Unable to connect to Oracle 11g database using JDBC on Android

我正在尝试将我的 Android 应用程序连接到我笔记本电脑上托管的 Oracle 数据库快捷版 11g。我正在我的 phone 上测试该应用程序,其热点打开,笔记本电脑通过 WiFi 连接到该热点。

我已将 ojdbc14.jar 添加到 app/libs 目录并通过 Android Studio 选择了 Add as Library 选项。

我收到以下错误:

Rejecting re-init on previously-failed class java.lang.Class<oracle.jdbc.pool.OracleDataSource>: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/Referenceable;

Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.Referenceable" on path: DexPathList

W/System.err: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection

P.s。我知道使用服务器是更好的方法。为希望在安全专用网络中使用它并且不想为数据库连接托管单独服务器的客户执行此操作。

我在别处读到我需要使用异步任务来连接 JDBC 但我不确定如何;认为我是初学者。我发现与此相关的所有其他答案都离题了。考虑到风险,我只想知道如何让 JDBC 在 Android 上工作。

这是我的 MainActivity.java:

package com.absingh.apptest;

import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MainActivity extends AppCompatActivity {

    private static final String DEFAULT_DRIVER = "oracle.jdbc.driver.OracleDriver";
    private static final String DEFAULT_URL = "jdbc:oracle:thin:@192.168.42.49:1521:XE";
    private static final String DEFAULT_USERNAME = "myusername";
    private static final String DEFAULT_PASSWORD = "mypassword";

    private Connection connection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        TextView tv = (TextView) findViewById(R.id.hello);
        try {
            this.connection = createConnection();
            Toast.makeText(MainActivity.this, "Connected",
                    Toast.LENGTH_SHORT).show();
            Statement stmt=connection.createStatement();
            StringBuffer stringBuffer = new StringBuffer();
            ResultSet rs=stmt.executeQuery("select * from testtable");
            while(rs.next()) {
                stringBuffer.append( rs.getString(1)+"\n");
            }
            tv.setText(stringBuffer.toString());
            connection.close();
        }
        catch (Exception e) {

            Toast.makeText(MainActivity.this, ""+e,
                    Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }

    public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException {

        Class.forName(driver);
        return DriverManager.getConnection(url, username, password);
    }

    public static Connection createConnection() throws ClassNotFoundException, SQLException {
        return createConnection(DEFAULT_DRIVER, DEFAULT_URL, DEFAULT_USERNAME, DEFAULT_PASSWORD);
    }
}

没关系,我想通了。 如果您将其添加到 AndroidManifest.xml

中的 application 标记上方,则问题中的代码可以正常工作
<uses-permission android:name="android.permission.INTERNET" />

我会留下这个问题,以防其他人遇到同样的问题。