tutorial studio para example crear con php android mysql android-asynctask networkonmainthread

para - login android studio mysql php json



Conecte mySQL con Android (1)

Quiero poder, usando mi dispositivo Android, conectarme a una base de datos mySQL, enviar un parámetro que se utilizará en una declaración SQL, y quiero recuperar el resultado y poder presentarlo. Parece fácil, pero todos los tutoriales y ejemplos que puedo encontrar sufren:

  • extremadamente sobreconstruido (10 clases mínimo para hacer ese botón perfecto)
  • increíblemente confuso (sin comentarios, explicaciones y nombres de variables retardadas)
  • depende de las clases que no existen

Si elimino algo innecesario, todo se bloquea, por lo que no puedo extraer lo que realmente es importante para que sea legible / comprensible de forma remota.

Entonces, de la manera más simple posible: ¿qué se necesita en mi aplicación de Android para conectarme a mi base de datos? ¿Cómo envío un parámetro al php-script? ¿Cómo puedo generar un resultado que la aplicación de Android pueda leer?

ACTUALIZACIÓN, ESSENTIALS DE STRIPPING TOMAN 1 Por lo tanto, como mencioné en uno de los comentarios sobre la respuesta de SoftCoder, intentaré tomar su aplicación completa y eliminar las cosas de lujo para obtener solo lo que se necesita para conectar mySQL.

Primero, agregué <uses-permission android:name="android.permission.INTERNET" /> en el manifiesto. El .php se ve así (host, usuario, contraseña, etc. es algo más en realidad):

<?php $con = mysql_connect("HOST","USER","PASSWORD"); if (!$con) { die(''Could not connect: '' . mysql_error()); } mysql_select_db("database_name", $con); $result = mysql_query("SELECT * FROM Table;"); while($row = mysql_fetch_array($result)) { echo $row[''col1'']; echo $row[''col2'']; } mysql_close($con); ?>

Este script imprime todas las entradas de la tabla.

¡Ahora a la actividad completa!

package com.example.project; import java.io.*; import org.apache.http.HttpResponse; import org.apache.http.client.*; import org.apache.http.client.methods.*; import org.apache.http.impl.client.*; import org.json.*; import android.app.*; import android.os.*; import android.util.*; import android.view.*; import android.widget.*; public class MainActivity extends Activity { private String jsonResult; private String url = "url_to_php"; InputStream is=null; String result=null; String line=null; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //supposedly the app wont crash with "NetworkOnMainThreadException". It crashes anyway StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); //create our Async class, because we can''t work magic in the mainthread JsonReadTask task = new JsonReadTask(); task.execute(new String[] { url }); } private class JsonReadTask extends AsyncTask<String, Void, String> { // doInBackground Method will not interact with UI protected String doInBackground(String... params) { // the below code will be done in background HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(params[0]); try { //not sure what this does but it sounds important HttpResponse response = httpclient.execute(httppost); //took the "stringbuilder" apart and shoved it here instead String rLine = ""; StringBuilder answer = new StringBuilder(); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); while ((rLine = rd.readLine()) != null) answer.append(rLine); //put the string into a json, don''t know why really jsonResult = answer.toString(); } catch (ClientProtocolException e) { e.printStackTrace(); Log.e("Fail 12", e.toString()); } catch (IOException e) { Log.e("Fail 22", e.toString()); e.printStackTrace(); } return null; } } // after the doInBackground Method is done the onPostExecute method will be called protected void onPostExecute(String result) throws JSONException { // I skipped the method "drwer"-something and put it here instead, since all this method did was to call that method // getting data from server JSONObject jsonResponse = new JSONObject(jsonResult); if(jsonResponse != null) { //I think the argument here is what table we''ll look at... which is weird since we use php for that JSONArray jsonMainNode = jsonResponse.optJSONArray("Tablename"); // get total number of data in table for (int i = 0; i < jsonMainNode.length(); i++) { JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); String name = jsonChildNode.optString("col1"); // here name is the table field String number = jsonChildNode.optString("col2"); // here id is the table field String outPut = name + number ; // add two string to show in listview //output to log instead of some weird UI on the device, just to see if it connects Log.d("Log", outPut.toString()); } } } public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) return true; return super.onOptionsItemSelected(item); } }

Así que esto es lo que se me ocurrió hasta ahora que podría contar como "lo más simple posible", sin IU de lujo o saltando entre métodos (utilizando buenas convenciones de código no es importante aquí). Como todo falla con una "NetworkOnMainThreadException" como alguien más dijo que lo haría, es imposible probarlo. ¿Por qué está fallando con esta excepción a pesar de que estoy usando tanto AsyncTask como call the Strict-thingy?


Aquí está el ejemplo

EDITAR: Primero cree una base de datos Nombre suponga dbname en MySql en wamp o en su servidor y cree una tabla llamada emp_info en la cual se agregan dos campos id y name

Aquí el escenario es insertar la identificación y el NOMBRE del empleado de la base de datos del servidor EDITTEXT a MYSQL

Las variables globales son

String name; String id; InputStream is=null; String result=null; String line=null; int code;

Para el código de actividad

import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class add extends Activity { String name; String id; InputStream is=null; String result=null; String line=null; int code; String tobed = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); final EditText e_id=(EditText) findViewById(R.id.editText1); final EditText e_name=(EditText) findViewById(R.id.editText2); Button insert=(Button) findViewById(R.id.button1); insert.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub id = e_id.getText().toString(); name = e_name.getText().toString(); insert(); } }); } }

Método de inserción de datos

public void insert() { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); // put the values of id and name in that variable nameValuePairs.add(new BasicNameValuePair("id",id)); nameValuePairs.add(new BasicNameValuePair("name",name)); try { HttpClient httpclient = new DefaultHttpClient(); // here is the php file // for local use for example if you are using wamp just put the file in www/project folder HttpPost httppost = new HttpPost("http://10.0.2.2/project/insert2.php"); // if the file is on server HttpPost httppost = new HttpPost("http://example.com/insert2.php"); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); Log.e("pass 1", "connection success "); } catch(Exception e) { Log.e("Fail 1", e.toString()); Toast.makeText(getApplicationContext(), "Invalid IP Address", Toast.LENGTH_LONG).show(); } try { BufferedReader reader = new BufferedReader (new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line + "/n"); } is.close(); result = sb.toString(); Log.e("pass 2", "connection success "); } catch(Exception e) { Log.e("Fail 2", e.toString()); } try { // get the result from php file JSONObject json_data = new JSONObject(result); code=(json_data.getInt("code")); if(code==1) { Toast.makeText(getBaseContext(), "Inserted Successfully", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getBaseContext(), "Sorry, Try Again", Toast.LENGTH_LONG).show(); } } catch(Exception e) { Log.e("Fail 3", e.toString()); Log.i("tagconvertstr", "["+result+"]"); } }

aquí está el archivo insert2.php

<?php // this variables is used for connecting to database and server $host="yourhost"; $uname="username"; $pwd=''pass''; $db="dbname"; // this is for connecting $con = mysql_connect($host,$uname,$pwd) or die("connection failed"); mysql_select_db($db,$con) or die("db selection failed"); // getting id and name from the client if(isset($_REQUEST)){ $id=$_REQUEST[''id'']; $name=$_REQUEST[''name''];} $flag[''code'']=0; // query for insertion // table name emp_info and its fields are id and name if($r=mysql_query("insert into emp_info values(''$name'',''$id'') ",$con)) { // if query runs succesfully then set the flag to 1 that will be send to client app $flag[''code'']=1; echo"hi"; } // send result to client that will be 1 or 0 print(json_encode($flag)); //close mysql_close($con); ?>

Segunda edición: -

Para leer los datos, he hecho asyntask

Aquí los datos se muestran en una vista de lista.

public class read extends Activity { private String jsonResult;// // use this if your file is on server private String url = "http://exmaple.com/read.php"; // use this if you are locally using // private String url = "http://10.0.2.2/project/read.php"; private ListView listView; Context context; String name; String id; InputStream is=null; String result=null; String line=null; int code; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.read); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); context = this; listView = (ListView) findViewById(R.id.listView1); accessWebService(); }

Método accessWebService

public void accessWebService() { JsonReadTask task = new JsonReadTask(); task.execute(new String[] { url }); }

para la clase JsonReadTask

private class JsonReadTask extends AsyncTask<String, Void, String> { // doInBackground Method will not interact with UI @Override protected String doInBackground(String... params) { // the below code will be done in background HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(params[0]); try { HttpResponse response = httpclient.execute(httppost); jsonResult = inputStreamToString( response.getEntity().getContent()).toString(); } catch (ClientProtocolException e) { e.printStackTrace(); Log.e("Fail 12", e.toString()); } catch (IOException e) { Log.e("Fail 22", e.toString()); e.printStackTrace(); } return null; } private StringBuilder inputStreamToString(InputStream is) { String rLine = ""; StringBuilder answer = new StringBuilder(); BufferedReader rd = new BufferedReader(new InputStreamReader(is)); try { while ((rLine = rd.readLine()) != null) { answer.append(rLine); } } catch (IOException e) { // e.printStackTrace(); Toast.makeText(getApplicationContext(), "Error..." + e.toString(), Toast.LENGTH_LONG).show(); } return answer; } // after the doInBackground Method is done the onPostExecute method will be called @Override protected void onPostExecute(String result) { // here you can interact with UI ListDrwaer(); } }// end async task

Método ListDrawaer

// build hash set for list view public void ListDrwaer() { List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>(); try { // getting data from server JSONObject jsonResponse = new JSONObject(jsonResult); if(jsonResponse != null) { JSONArray jsonMainNode = jsonResponse.optJSONArray("emp_info"); // get total number of data in table for (int i = 0; i < jsonMainNode.length(); i++) { JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); String name = jsonChildNode.optString("name"); // here name is the table field String number = jsonChildNode.optString("id"); // here id is the table field String outPut = name + number ; // add two string to show in listview employeeList.add(createEmployee("employees", outPut)); } } } catch (JSONException e) { Toast.makeText(getApplicationContext(), "Error" + e.toString(), Toast.LENGTH_SHORT).show(); } SimpleAdapter simpleAdapter = new SimpleAdapter(this, employeeList, android.R.layout.simple_list_item_1, new String[] { "employees" }, new int[] { android.R.id.text1 }); listView.setAdapter(simpleAdapter); } private HashMap<String, String> createEmployee(String name, String number) { HashMap<String, String> employeeNameNo = new HashMap<String, String>(); employeeNameNo.put(name, number); return employeeNameNo; } }

y su código de archivo read.php

<?php $host="localhost"; //replace with database hostname $username="root"; //replace with database username $password=""; //replace with database password $db_name="dbname"; //replace with database name $con=mysql_connect("$host", "$username", "$password")or die("cannot connect"); mysql_select_db("$db_name")or die("cannot select DB"); $sql = "select * from emp_info"; $result = mysql_query($sql); $json = array(); if(mysql_num_rows($result)){ while($row=mysql_fetch_assoc($result)){ $json[''emp_info''][]=$row; } } mysql_close($con); echo json_encode($json); ?>

y si desea verificar su conexión a Internet antes de usar esta inserción y lectura, use este método ... es decir, ponga este método en la declaración if else

public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnectedOrConnecting()) { return true; } return false; }

Para la Actualización y eliminación, utilice el método de inserción para pasar los valores al servidor y simplemente cambie la consulta de insert2.php para actualizar los que se encuentran en esta lista.

if($r=mysql_query("UPDATE emp_info SET employee_name = ''$name'' WHERE employee_name = ''$id''",$con)) { $flag[''code'']=1; }

para borrar

if($r=mysql_query("DELETE FROM emp_info WHERE employee_name = ''$name''",$con)) { $flag[''code'']=1; echo"hi"; }

Además, cuando haya aprendido esto, la próxima tarea que debe aprender a enhebrar y Asyntask para hacerlo más mejorado, ya que trabajar en el hilo principal no es bueno en Android. simplemente ponga este método de inserción en Asyntask como lo mencioné en el método de lectura para que la interfaz de usuario no se vea perturbada y la cosa de Internet se haga en segundo plano.

NOTA:

para la nueva versión de php agregue esta línea después de <?php snippet

error_reporting(E_ALL ^ E_DEPRECATED);