This is an old revision of the document!
Database: MySQL
DB Connector
Download the appropriate Java database connector:
- Download JDBC / ConnectorJ library (select 'Platform Independent' version).
- Extract JAR file to some folder.
- Add JAR file as module:
app
, right-click thenNew
>Module
, then select 'Import .JAR/.AAR Package', and find JAR file. - JAR package should be now listed under the project Gradle Scripts:
build.gradle (mysql-connector-java-8.0.11)
. - If there is an error including the JAR package, try the following:
- In
settings.gradle (Project Settings)
, add references to the mysql-connector-java:include ':app' include ':mysql-connector-java-8.0.11'
- Sync project (File > Sync Project with Gradle Files).
- Add
mysql-connector-java
module as dependency toapp
module:- Right-click on the
app
module folder, and select “Open Module Settings” (F4). - In the top left navigation pane of the “Project Structure” window, go to category “Modules” and select tab “Dependencies”.
- Click on the green plus (+), and select 'Module Dependencies'. Select the
mysql-connector-java
module. - Click OK, and close all the opened windows. A synchronization process should take place once more.
- If there is an error including the JAR package, try the following:
- In
build.gradle (Module:app)
, add references to compilemysql-connector-java
under dependencies:dependencies { //... compile project(':mysql-connector-java-8.0.11') }
- If succesful, under the
app
module folder there should be amysql-connector-java
module folder. - Include the classes required in your code.
Manifest
Add permission to access the Internet and Network State. Go to app
> manifests
> AndroidManifest.xml
:
<manifest...> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application...> </application> </manifest>
Database Strings
Create a class to hold the database strings: File DbStrings.java
:
package com.acme.myapp; public class DbStrings { static final String DATABASE_URL = "192.168.0.1:3306"; static final String DATABASE_NAME = "mydatabase"; static final String USERNAME = "dbuser"; static final String PASSWORD = "dbsecret"; }
ItemAdapter
Create class ItemAdapter
- Go to project tree, select
app
>java
><your app package name>
. Right-click and selectNew
>Java Class
. - Name:
ItemAdapter
- Kind:
Class
- Superclass:
android.widget.BaseAdapter
package com.acme.myapp; import android.view.ViewGroup; import android.widget.BaseAdapter; public class ItemAdapter extends BaseAdapter { LayoutInflater mInflater; Map<String, Double> map; // products & prices List<String> products; List<Double> prices; // // Constructor: Create custom constructor so properties get assigned right away // public ItemAdapter(Context cx, Map m) { map = m; products = new ArrayList<String>(map.keySet()); prices = new ArrayList<Double>(map.values()); mInflater = (LayoutInflater) cx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return map.size(); } @Override public Object getItem(int idx) { return products.get(idx); } @Override public long getItemId(int idx) { return idx; } @Override public View getView(int idx, View view, ViewGroup viewGroup) { // Use layout inflater. Use listview_detail.xml layout View vw = mInflater.inflate(R.layout.listview_detail, null); TextView lblProduct = (TextView) vw.findViewById(R.id.lblProduct); TextView lblPrice = (TextView) vw.findViewById(R.id.lblPrice); String strProduct = arrProducts.get(idx); String strPrice = "$" + arrPrices.get(idx).toString(); lblProduct.setText(strProduct); lblPrice.setText(strPrice); return vw; } }
MainActivity
package com.acme.myapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { // Properties ItemAdapter itemAdapter; Context thisContext; ListView lstProducts; TextView lblProgress; Map<String,Double> mapProducts = new LinkedHashMap<String,Double>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Resources res = getResources(); lstItems = (ListView) findViewById(R.id.lstItems); lblProgress = (TextView) findViewById(R.id.lblProgress); thisContext = this; lblProgress.setText(""); Button bntConnect = (Button) findViewById(R.id.btnConnect); btnConnect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View vw) { GetData retrieveData = new GetData(); retrieveData.execute(""); } }); } private class GetData extends AsyncTask<String,String,String> { // Properties String msg = ""; // progress textview // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; // Example: 192.168.0.2:3306 static final String DB_URL = "jdbc:mysql://" + DbStrings.DATABASE_URL + "/" + DbStrings.DATABASE_NAME; @Override protected void onPreExecute() { lblProgress.setText("Connecting to database..."); } @Override protected String doInBackground(String... params) { Connection conn = null; Statement stmt = null; try { Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(DB_URL, DbStrings.USERNAME, DbStrings.PASSWORD); stmt = conn.createStatement(); String sql = "SELECT * FROM products"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()) { String name = rs.getString("name"); double price = rs.getDouble("price"); mapProducts.put(name, price); } msg = "Process complete."; rs.close(); stmt.close(); conn.close(); } catch (SQLException connError) { msg = "Exception was thrown for JDBC."; connError.printStackTrace(); } catch (ClassNotFoundException ex) { msg = "A 'Class not Found' exception was thrown."; ex.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } } catch (SQLException ex) { ex.printStackTrace(); } try { if (conn != null) { conn.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } return null; } @Override protected void onPostExecute(String msg) { lblProgress.setText(this.msg); if (mapProducts.size() > 0) { itemAdapter = new ItemAdapter(thisContext, mapProducts); lstProducts.setAdapter(itemAdapter); } } } }
Example Quick Connection
activity_main.xml
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:id="@+id/textView0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> </RelativeLayout>
MainActivity.java
:
package com.example.andmysql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.widget.TextView; public class MainActivity extends Activity implements Runnable { private String hiduke = ""; private int price = 0; private String errmsg = ""; public void run() { System.out.println("Select Records Example by using the Prepared Statement!"); int count = 0; try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection ("jdbc:mysql://10.0.2.2:3306/stock","root","secret"); try { String sql; //sql = "SELECT title,year_made FROM movies WHERE year_made >= ? AND year_made <= ?"; sql = "SELECT hiduke, jikan, code, price FROM table_stock"; PreparedStatement qry = conn.prepareStatement(sql); //qry.setInt(1,1980); //qry.setInt(2,2004); ResultSet rs = qry.executeQuery(); while (rs.next()) { hiduke = rs.getString(1); price = rs.getInt(4); count++; System.out.println(hiduke + "\t" + "- " + price); } System.out.println("Number of records: " + count); qry.close(); conn.close(); } catch (SQLException ex) { System.out.println("SQL statement is not executed!"); errmsg = errmsg + ex.getMessage(); } } catch (Exception ex) { ex.printStackTrace(); errmsg = errmsg + ex.getMessage(); } handler.sendEmptyMessage(0); } private Handler handler = new Handler() { public void handleMessage(Message msg) { TextView textView = (TextView) findViewById(R.id.textView0); textView.setText("hiduke = " + hiduke + " price = " + price + " " + errmsg); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Thread thread = new Thread(this); thread.start(); } }