Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android JDBC not working: ClassNotFoundException on driver

I'm trying to use JDBC in my Android application to connect to a remote database to do inserts, queries, etc. I have successfully connected and done these things in a different JAVA project. So I figured since Android is Java, I could just port over the relevant code, add the same build path for the driver, etc. But it gives me the error:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

I really don't think it's a code issue since the same code works in a Java project (which I just execute in main()). But for reference here it is:

String url = "jdbc:mysql://localhost:3306/eventhub_test"; //
    String user = "root"; 
    String pass = "";

 SQLUtils sqlu = new SQLUtils(url, user, pass);

//the SQLUtils class I made:

public class SQLUtils {


private String CONNECTION_URL;
private String user;
private String pass;
private java.sql.Statement stmt; 
private java.sql.Connection conn;

public SQLUtils(String conn_url, String user, String pass) {
    this.CONNECTION_URL = conn_url; 
    this.user = user;
    this.pass = pass; 
}


public void init() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException {

    Class.forName ("com.mysql.jdbc.Driver").newInstance ();
    conn = DriverManager.getConnection(CONNECTION_URL, user, pass);
    stmt = conn.createStatement();

}
}

So I'm really confused here. Does JDBC not work with Android? If so, tell me what alternatives I should look into for remote MySQL database access.

Thanks.

like image 876
JDS Avatar asked Aug 28 '11 14:08

JDS


People also ask

How do I fix no suitable driver for JDBC?

In brief, we can say that such an error occurs when no JDBC JAR file is added to the classpath of Java. Just we need to add the JAR file to the classpath and then execute the code. The code will hopefully get executed with success.

How do I add mysql connector jar to classpath?

After extracting the distribution archive, you can install the driver by placing MySQL-connector-java-version-bin. jar in your classpath, either by adding the full path to it to your classpath environment variable or by directly specifying it with the command line switch -cp when starting the JVM.


3 Answers

Does JDBC not work with Android?

JDBC is infrequently used on Android, and I certainly would not recommend it.

IMHO, JDBC is designed for high-bandwidth, low-latency, highly-reliable network connections (e.g., desktop to database server, Web application server to database server). Mobile devices offer little of these, and none of them consistently.

If so, tell me what alternatives I should look into for remote MySQL database access.

Create a Web service around your database and access that from Android.

As side benefits, you improve security (vs. leaving your database open), can offload some business logic from the client, can better support other platforms (e.g., Web or Web-based mobile frameworks), etc.

like image 188
CommonsWare Avatar answered Nov 06 '22 03:11

CommonsWare


I had a TON of trouble with this for some reason. It is mentioned elsewhere that only 3.017 driver works, and since I made such detailed instructions I figured I'd share them. (My initial purpose was to give steps to reproduce error that I could use to ask a question here and elsewhere. No, I can't begin to guess why I had so much trouble now looking back)


To: Get JDBC Driver in Android app

  • New Android Project - AndroidJDBCTest, Target Android4.03, minimum sdk 8 (Android 2.2), package name “com.test.AndroidJDBCTest”
  • Right click on project, new folder “libs”
  • Download Mysql JDBC Driver from here and extract it to your filesystem.
  • Browse to the root directory after extracting and drag and drop the jar mysql-connector-java-3.0.17-ga-bin.jar into /libs in your project in project explorer inside Eclipse., using the default “copy” setting for the drag and drop.
  • Right click on the Eclipse Project, Build Path-Configure Build Path, Add JAR under libraries tab - Browse to /AndroidJDBCTest/libs and the jar file and click ok
  • NOTE: It shows up now under “Referenced Libraries” node (if Eclipse is set to show it)
  • Add code from here to the end of onCreate() - basically Class.forName("com.mysql.jdbc.Driver").newInstance();
  • Attach Honeycomb device such as Motorola Xoom family Edition and run
like image 21
nAndroid Avatar answered Nov 06 '22 02:11

nAndroid


Leaving aside the valid objections, you can make it work.

Firstly make sure you have a valid driver jar in you build path, I used

mysql-connector-java-5.1.7-bin.jar

Secondly, if you are trying it in the emulator and your db is on you development machine, 'localhost' is no good in the URL. You need '10.0.2.2'

My URL is :

String url = "jdbc:mysql://10.0.2.2/test";

test being my db name.

I've got a table called 'books' with a column 'title' in it

The following code works for me:

public void init() throws IllegalAccessException, InstantiationException,
        ClassNotFoundException, SQLException {

    Class.forName("com.mysql.jdbc.Driver").newInstance();
    try {
        conn = DriverManager.getConnection(CONNECTION_URL, user, pass);
    } catch (java.sql.SQLException e1) {
        e1.printStackTrace();
    }
    try {

        stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT title FROM books");
        String entry;
        while (rs.next()){
            entry = rs.getString(1);
        }
        rs.close();
        stmt.close();
        conn.close();
    } catch (java.sql.SQLException e) {
        e.printStackTrace();
    }

}

Stepping through in the debugger, I see the titles in String entry

like image 5
NickT Avatar answered Nov 06 '22 02:11

NickT