= Database: MySQL = == Using RESTful API == == Using Java Connector (no API) == ==== DB Connector ==== Download the appropriate Java database connector: * [[https://dev.mysql.com/downloads/connector/j/3.0.html|Download JDBC / ConnectorJ library]] (select 'Platform Independent' version). * Extract JAR file to some folder. * Add JAR file as module: ''app'', right-click then ''New'' > ''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 to ''app'' 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 compile ''mysql-connector-java'' under dependencies: dependencies { //... compile project(':mysql-connector-java-8.0.11') } * If succesful, under the ''app'' module folder there should be a ''mysql-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'': ==== 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'' > //''''//. Right-click and select ''New'' > ''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 map; // products & prices List products; List prices; // // Constructor: Create custom constructor so properties get assigned right away // public ItemAdapter(Context cx, Map m) { map = m; products = new ArrayList(map.keySet()); prices = new ArrayList(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 mapProducts = new LinkedHashMap(); @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 { // 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'': ''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(); } } See: [[https://gist.github.com/cofearabi/5039135]] == References == See also: * [[swdev:java:Connecting to MySQL Database]] * [[https://www.youtube.com/watch?v=bu5Y3uZ6LLM|Butterfield: Studio For Beginners Part 4: Connecting to MySQL]] * [[https://www.simplifiedcoding.net/android-mysql-tutorial-to-perform-basic-crud-operation|Android MySQL Tutorial to Perform Basic CRUD Using API]] * [[http://www.helloandroid.com/tutorials/connecting-mysql-database|Connecting MySQL Database with API]] * [[http://androidbash.com/connecting-android-app-to-a-database-using-php-and-mysql|Connecting Android App to MySQL Database]]