Невозможно подключиться к базе данных Oracle 11g с помощью JDBC на Android - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь подключить свое приложение Android к Oracle Database Express Edition 11g, размещенному на моем ноутбуке.Я тестирую приложение на своем телефоне с включенной точкой доступа, к которой ноутбук подключен через WiFi.

Я добавил ojdbc14.jar в каталог app/libs и выбрал опцию Add as Library через AndroidStudio.

Я получаю следующие ошибки:

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

PsЯ знаю, что использование сервера - лучший подход.Это делается для клиента, который хочет использовать его в защищенной частной сети и не хочет размещать отдельный сервер для подключения к базе данных.

Я читал в другом месте, что мне нужно использовать задачу Async для подключения 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);
    }
}

1 Ответ

0 голосов
/ 27 января 2019

Неважно, я понял это.Код в вопросе работает нормально, если вы добавите его выше тега application в AndroidManifest.xml

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

. Я оставлю вопрос на тот случай, если кто-то другой получит такую ​​же проблему.

...