36
Índice de contenido 1 JSONParser..................................................... 2 1.1 Imports...................................................2 1.2 Clase.....................................................2 1.3 Codigo....................................................4 2 OrdersActivity................................................. 6 2.1 Activity..................................................6 2.2 Clase.....................................................8 2.2.1 Imports.............................................8 2.2.2 Clase...............................................8 2.2.3 JSON...............................................10 2.2.4 AcesoDB............................................12 2.2.5 Lista..............................................13 2.2.6 Codigo.............................................15 3 User_button................................................... 19 3.1 Activity.................................................19 4 Order......................................................... 20 5 DBAbaco....................................................... 22 5.1 Imports..................................................22 5.2 Clase....................................................22 5.3 Creacion de la DB........................................24 5.4 Funciones................................................26 5.5 Codigo...................................................27

JSON Android

Embed Size (px)

Citation preview

Page 1: JSON Android

Índice de contenido1 JSONParser........................................................................................................................................2

1.1 Imports..................................................................................................................................21.2 Clase......................................................................................................................................21.3 Codigo...................................................................................................................................4

2 OrdersActivity...................................................................................................................................62.1 Activity..................................................................................................................................62.2 Clase......................................................................................................................................8

2.2.1 Imports......................................................................................................................82.2.2 Clase.........................................................................................................................82.2.3 JSON.......................................................................................................................102.2.4 AcesoDB.................................................................................................................122.2.5 Lista........................................................................................................................132.2.6 Codigo....................................................................................................................15

3 User_button.....................................................................................................................................193.1 Activity................................................................................................................................19

4 Order................................................................................................................................................205 DBAbaco.........................................................................................................................................22

5.1 Imports................................................................................................................................225.2 Clase....................................................................................................................................225.3 Creacion de la DB...............................................................................................................245.4 Funciones............................................................................................................................265.5 Codigo.................................................................................................................................27

Page 2: JSON Android

JSONParser

Para recoger datos de una pagina https sin comprobar el certificado desde el JSON hay que hacer lo siguiente.

2.1 Imports

Primeramente crearemos una clase que se va a llamar JSONParser que hará la llamada al sitio web y recogerá los datos del JSON. Empezara con los imports de la siguiente manera:import android.util.Log;import org.json.JSONException;import org.json.JSONObject;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;

2.2 ClaseY ahora si empezamos la clase inicializando las variables que necesitamos:public class JSONParser { static JSONObject jObj = null; static String json = ""; String responseJsonData = null; HttpURLConnection conn = null;

Ahora creamos el constructor:public JSONParser() {}

Lo siguiente que haremos sera empezar la verificacion del sitio web:final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; }};

Ahora crearemos la funcion para aceptar todos los verificados:private static void trustAllHosts() {

Page 3: JSON Android

TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[] {}; } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } }; try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); }}

Bien, ya tenemos las funciones de como verificar el sitio web y de aceptar todos los certificados, ahora nos queda hacer la conexión. Desde la clase que llama a JSONParser le pasamos la URL y el método (GET, PUT, POST, etc...) así que sabiendo esto empezamos la función:public JSONObject makeHttpRequest(String url, String method) { try { URL url1 = new URL(url);

Ahora comprobaremos si tiene protocolo https o no y si lo tiene verificaremos el sitio y aceptaremos todos los certifiados y si no haremos una conexión normal sin comprobaciones:if (url1.getProtocol().toLowerCase().equals("https")) { trustAllHosts(); HttpsURLConnection https = (HttpsURLConnection) url1.openConnection(); https.setHostnameVerifier(DO_NOT_VERIFY); conn = https;} else { conn = (HttpURLConnection) url1.openConnection();}conn.setRequestMethod(method);

Una vez hecha la conexión descargamos los datos del JSON:System.out.println("Response Code: " + conn.getResponseCode());BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));if(in !=null) { StringBuilder sb = new StringBuilder(); String line = null; while ((line = in.readLine()) != null) { sb.append(line + "\n"); } in.close(); json = sb.toString();}responseJsonData = new String(json);

Una vez descargados terminamos las excepciones y metemos los datos en un JSONObject: } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) {

Page 4: JSON Android

e.printStackTrace(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } return jObj; }}

2.3 CodigoEl código entero seria así:import android.util.Log;import org.json.JSONException;import org.json.JSONObject;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;

public class JSONParser { static JSONObject jObj = null; static String json = ""; String responseJsonData = null; HttpURLConnection conn = null; public JSONParser() { } final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; private static void trustAllHosts() { TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[] {}; } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } }; try { SSLContext sc = SSLContext.getInstance("TLS");

Page 5: JSON Android

sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); } } public JSONObject makeHttpRequest(String url, String method) { try { URL url1 = new URL(url); if (url1.getProtocol().toLowerCase().equals("https")) { trustAllHosts(); HttpsURLConnection https = (HttpsURLConnection) url1.openConnection(); https.setHostnameVerifier(DO_NOT_VERIFY); conn = https; } else { conn = (HttpURLConnection) url1.openConnection(); } conn.setRequestMethod(method); System.out.println("Response Code: " + conn.getResponseCode()); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); if(in !=null) { StringBuilder sb = new StringBuilder(); String line = null; while ((line = in.readLine()) != null) { sb.append(line + "\n"); } in.close(); json = sb.toString(); } responseJsonData = new String(json); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } return jObj; }}

OrdersActivity

Y ya tenemos el JSONParser hecho, ahora nos queda como hacer la llamada y como recoger los datos para meterlos en una DB y de ahí sacarlos en una lista para después ponerlo en pantalla.

3.1 Activity

Page 6: JSON Android

Dicho esto creamos una activity nueva que tendrá una lista y un botón de actualizar los datos del JSON:<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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.urlanheat.abacowarehouse.OrdersActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ordersListing" android:layout_weight="1" android:touchscreenBlocksFocus="true" android:longClickable="true" android:fastScrollEnabled="true" android:clickable="true" android:smoothScrollbar="true" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_above="@+id/updateButton" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ACTUALIZAR" android:id="@+id/updateButton" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /></RelativeLayout>

Nos debería quedar una pantalla de la siguiente manera:

Page 7: JSON Android
Page 8: JSON Android

3.2 Clase

Una vez hecha ya la activity procederemos a configurar el codigo.

3.2.1 Imports

Primero, como no, empezaremos con los imports que vamos a necesitar:import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.os.AsyncTask;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.urlanheat.abacowarehouse.util.DBAbaco;import com.urlanheat.abacowarehouse.util.JSONParser;import com.urlanheat.abacowarehouse.util.Order;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.util.ArrayList;import java.util.List;

3.2.2 Clase

Empezamos la clase inicializando las variables:public class OrdersActivity extends ActionBarActivity { private List<Order> ordersList = new ArrayList<Order>(); int orderType = 0; String myUrl = "https://******************************"; JSONParser jParser = new JSONParser(); JSONArray reservation = null; JSONArray listing = null; Button btnUpdate; DBAbaco db;

Ahora haremos el onCreate que preparara el botón de actualizar para sacar la lista de

Page 9: JSON Android

pedidos de la DB:@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_order); db = new DBAbaco(this); db.open(); Bundle b = getIntent().getExtras(); orderType = Integer.parseInt((String) b.getCharSequence("listingType")); setupUpdateButton();}

A continuación tenemos las opciones por defecto al crear una activity que no tocaremos:@Overridepublic boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_pedidos, menu); return true;}@Overridepublic 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(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item);}

Llamaremos a la funcion setupUpdateButton() que tendrá el siguiente código:private void setupUpdateButton(){ btnUpdate = (Button) findViewById(R.id.updateButton); btnUpdate.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new LoadAllOrders().execute(); } });}

3.2.3 JSON

Esta función prepara el botón para que al hacer un click en el cargue los datos del JSON a la DB. Al no saber cuento puede durar la descarga y para que el sistema no nos cierre el proceso

Page 10: JSON Android

lo haremos en una tarea Asíncrona, es decir, en segundo plano. Como es otra clase dentro de la misma clase tendremos que inicializar las variables que utilizaremos en esta tarea:class LoadAllOrders extends AsyncTask<String, String, String> { private ProgressDialog progressDialog = new ProgressDialog(OrdersActivity.this); long orderID = 0; int status = 0; long clientID = 0; String clientName = ""; long detailID = 0; int equipmentTypeID = 0; String equipmentID = "";

Esta tarea en segundo plano lleva funciones opcionales, nosotros aprovecharemos algunas:protected void onPreExecute() { progressDialog.setMessage("Descargando pedidos..."); progressDialog.show(); progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface arg0) { LoadAllOrders.this.cancel(true); } });}

Con esta función lo que haremos sera poner un cuadro de dialogo de cargando mientras se descargan los datos del JSON. Ahora pondremos la función que hace la llamada al JSONParser y recoge los datos en variables para meterlos en la DB, para ello le pasaremos la URL que hemos puesto al principio del código y limpiaremos las listas y las tablas:@Overrideprotected String doInBackground(String... params) { String url_select = myUrl; ordersList.clear(); db.dropTables(); db.createTables();

Las funciones que veis aquí las explicaremos mas adelante cuando creemos la clase de la DB. Ahora empezaremos con la llamada al JSONParser:try { JSONObject json = jParser.makeHttpRequest(url_select, "GET");

Aqui hacemos la llamada al JSONParser y como hemos dicho en la clase del JSONParser, aquí le mandamos la URL y el metodo, en nuestro caso el GET. Ahora dejo una imagen de como se trata la estructura del JSON:

Page 11: JSON Android

Primeramente, el nombre de JSON no se coge, digamos que es el inicial.Se empezaría por pedidos, así que para “seleccionar” seria de la siguiente manera:JSONObject orders = json.getJSONObject("pedidos");

El item siguiente seria reservas, que como esta entre corchetes([]) seria una array, en este caso solo tendría un item, el código es el siguiente:reservation = orders.getJSONArray("reservas");

Ahora tenemos que recorrer el array:for (int reservationNumber = 0; reservationNumber < reservation.length(); reservationNumber++){

Ahora una vez empezado a recorrer el array, tenemos que selecciona la posicion, en nuestro aso seria el 0:JSONObject jsonObjOrders = reservation.getJSONObject(reservationNumber);Teniendo la posición, procedemos a coger los items del array:orderID = jsonObjOrders.getLong("id_reserva");status = jsonObjOrders.getInt("estado");clientID = jsonObjOrders.getLong("id_cliente");clientName = jsonObjOrders.getString("nombre");

Ahora vemos que nos llega otra subclase, pues bien hacemos como antes, “seleccionaremos” el item:JSONObject equipment = jsonObjOrders.getJSONObject("equipos");

Ya tenemos el item seleccionado, ahora cojeremos el array:listing = equipment.getJSONArray("listado");

Ahora nos recorreremos el array:for (int equipmentNumber = 0; equipmentNumber < listing.length(); equipmentNumber++){Nos recorremos el array:JSONObject jsonObjEquipment = listing.getJSONObject(equipmentNumber);

Page 12: JSON Android

Cogemos los items del nuevo array:detailID = jsonObjEquipment.getLong("id_detalle_reserva");equipmentTypeID = jsonObjEquipment.getInt("tipo_producto");equipmentID = jsonObjEquipment.getString("id_equipo");

A continuación como ya tenemos todos los items del array los guardamos en ls DB que posteriormente explicaremos la función:db.insertEquipment(detailID, equipmentTypeID, equipmentID, orderID);}

Una vez insertado en la base de datos del segundo array, ahora procederemos a insertar el primer array en la DB: db.insertOrder(orderID, status, clientID, clientName);}

y para acabar la funcion pondremos las excepciones:}catch(IllegalStateException e3){ Log.e("IllegalStateException", e3.toString()); e3.printStackTrace(); }catch(JSONException e5){ Log.e("JSONException", e5.toString()); e5.printStackTrace(); }return null;}

Ahora agregaremos otra función para que cuando finalice la función principal haga lo que le digamos, la función es la siguiente:@Override protected void onPostExecute(String s) { try { new AccesoDB().execute(); progressDialog.dismiss(); } catch (Exception e) { Log.e("JSONException", "Error: " + e.toString()); } }}

3.2.4 AcesoDB

En esta función lo que hacemos es pasar a otra tarea en segundo plano para sacar lo que tenemos guardado y meterlo en una lista. La mecánica de la clase es la misma, primero inicializar las variables:public class AccesoDB extends AsyncTask<Object, Integer, Boolean> { private ProgressDialog progressDialog = new ProgressDialog(OrdersActivity.this);

Ahora haremos la función que hace que salga un cuadro de dialogo con la descripción de cargando:protected void onPreExecute() { progressDialog.setMessage("Descargando pedidos...");

Page 13: JSON Android

progressDialog.show(); progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface arg0) { AccesoDB.this.cancel(true); } });}

Después iremos con la función principal que nos descargara los datos de la DB a la lista:@Overrideprotected Boolean doInBackground(Object... params) { ordersList.clear(); Cursor cursor = db.getOrderListing(orderType); if (cursor.moveToFirst()) { do { long orderID = cursor.getLong(DBAbaco.COL_ORDER_ID); ordersList.add(new Order(orderID)); } while (cursor.moveToNext()); } return null;}

Y para acabar haremos la ultima función que se hará cuando acabe la función principal:@Override protected void onPostExecute(Boolean s) { setupOrdersListView(); registerClickCallback(); progressDialog.dismiss(); }}

3.2.5 Lista

Esta función llama a otras funciones que no están en la tarea en segundo plano ya que no cargan mucho, por eso las colocaremos mas arriba (Cuando acabe os pondré el código entero). La función seria la siguiente:private void setupOrdersListView() { orderListAdapter adapter = new orderListAdapter(this, ordersList); ListView lvOrders = (ListView) findViewById(R.id.ordersListing); lvOrders.setAdapter(adapter);}

Esta función cargara la lista en la pantalla mediante un adapter:private class orderListAdapter extends ArrayAdapter<Order> { public orderListAdapter(Context context, List<Order> orders) { super(context, 0, orders); }

Page 14: JSON Android

@Override public View getView(int position, View convertView, ViewGroup parent) { View orderView = convertView; if (orderView==null) { orderView = getLayoutInflater().inflate(R.layout.user_button, parent, false); } Order currentOrder = ordersList.get(position); TextView orderID = (TextView) orderView.findViewById(R.id.user_name); orderID.setText(String.valueOf(currentOrder.getOrderID())); return orderView; }}

Una vez cargada la lista y los items se muestren en la pantalla la siguiente función registrara el poder clickear los items de la lista. Llamaremos a la función e inicializaremos la lista:private void registerClickCallback() { ListView list = (ListView) findViewById(R.id.ordersListing); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { Order selectedOrder;

Ahora haremos la propiedad del click de la lista:@Overridepublic void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) { getSelectedOrderFromList(position); displayOrderSelectedMessage(); showOrderDetailList();}

Dentro de esta propiedad tenemos 3 funciones, la primera seleccionara el item de la lista que hemos elegido:private void getSelectedOrderFromList(int position) { selectedOrder = ordersList.get(position);}

La segunda función pondrá un texto en la parte inferior de la pantalla para decir que hemos seleccionado el item:private void displayOrderSelectedMessage() { String message = String.format(getString(R.string.abc_selected_pedido), selectedOrder.getOrderID()); Toast.makeText(OrdersActivity.this, message, Toast.LENGTH_SHORT).show();}

Y en la ultima funcion hara la llamada a otra actividad:private void showOrderDetailList() { Intent intent = new Intent(OrdersActivity.this, OrderDetailActivity.class); Bundle b = new Bundle(); b.putString("orderID", String.valueOf(selectedOrder.getOrderID()));

Page 15: JSON Android

b.putString("orderType", String.valueOf(orderType)); intent.putExtras(b); startActivity(intent); } });}

3.2.6 Codigo

Habriamos terminado de programar la clase de la actividad que muestra la lista, el código completo y sin interrupciones seria el siguiente:import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.os.AsyncTask;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.urlanheat.abacowarehouse.util.DBAbaco;import com.urlanheat.abacowarehouse.util.JSONParser;import com.urlanheat.abacowarehouse.util.Order;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.util.ArrayList;import java.util.List;public class OrdersActivity extends ActionBarActivity { private List<Order> ordersList = new ArrayList<Order>(); int orderType = 0; String myUrl = "https://******************************"; JSONParser jParser = new JSONParser(); JSONArray reservation = null; JSONArray listing = null; Button btnUpdate; DBAbaco db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_order); db = new DBAbaco(this); db.open(); Bundle b = getIntent().getExtras(); orderType = Integer.parseInt((String) b.getCharSequence("listingType")); setupUpdateButton(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_pedidos, menu);

Page 16: JSON Android

return true; } @Override 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(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void setupUpdateButton(){ btnUpdate = (Button) findViewById(R.id.updateButton); btnUpdate.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new LoadAllOrders().execute(); } }); } private void setupOrdersListView() { orderListAdapter adapter = new orderListAdapter(this, ordersList); ListView lvOrders = (ListView) findViewById(R.id.ordersListing); lvOrders.setAdapter(adapter); } private void registerClickCallback() { ListView list = (ListView) findViewById(R.id.ordersListing); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { Order selectedOrder; @Override public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) { getSelectedOrderFromList(position); displayOrderSelectedMessage(); showOrderDetailList(); } private void getSelectedOrderFromList(int position) { selectedOrder = ordersList.get(position); } private void displayOrderSelectedMessage() { String message = String.format(getString(R.string.abc_selected_pedido), selectedOrder.getOrderID()); Toast.makeText(OrdersActivity.this, message, Toast.LENGTH_SHORT).show(); } private void showOrderDetailList() { Intent intent = new Intent(OrdersActivity.this, OrderDetailActivity.class); Bundle b = new Bundle(); b.putString("orderID", String.valueOf(selectedOrder.getOrderID())); b.putString("orderType", String.valueOf(orderType)); intent.putExtras(b); startActivity(intent); } }); } private class orderListAdapter extends ArrayAdapter<Order> {

Page 17: JSON Android

public orderListAdapter(Context context, List<Order> orders) { super(context, 0, orders); } @Override public View getView(int position, View convertView, ViewGroup parent) { View orderView = convertView; if (orderView==null) { orderView = getLayoutInflater().inflate(R.layout.user_button, parent, false); } Order currentOrder = ordersList.get(position); TextView orderID = (TextView) orderView.findViewById(R.id.user_name); orderID.setText(String.valueOf(currentOrder.getOrderID())); return orderView; } } public class AccesoDB extends AsyncTask<Object, Integer, Boolean> { private ProgressDialog progressDialog = new ProgressDialog(OrdersActivity.this); protected void onPreExecute() { progressDialog.setMessage("Descargando pedidos..."); progressDialog.show(); progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface arg0) { AccesoDB.this.cancel(true); } }); } @Override protected Boolean doInBackground(Object... params) { ordersList.clear(); Cursor cursor = db.getOrderListing(orderType); if (cursor.moveToFirst()) { do { long orderID = cursor.getLong(DBAbaco.COL_ORDER_ID); ordersList.add(new Order(orderID)); } while (cursor.moveToNext()); } return null; } @Override protected void onPostExecute(Boolean s) { setupOrdersListView(); registerClickCallback(); progressDialog.dismiss(); } } class LoadAllOrders extends AsyncTask<String, String, String> { private ProgressDialog progressDialog = new ProgressDialog(OrdersActivity.this); long orderID = 0; int status = 0; long clientID = 0; String clientName = ""; long detailID = 0; int equipmentTypeID = 0; String equipmentID = ""; protected void onPreExecute() { progressDialog.setMessage("Descargando pedidos..."); progressDialog.show();

Page 18: JSON Android

progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface arg0) { LoadAllOrders.this.cancel(true); } }); } @Override protected String doInBackground(String... params) { String url_select = myUrl; ordersList.clear(); db.dropTables(); db.createTables(); try { JSONObject json = jParser.makeHttpRequest(url_select, "GET"); Log.d("All Products: ", json.toString()); JSONObject orders = json.getJSONObject("pedidos"); reservation = orders.getJSONArray("reservas"); for (int reservationNumber = 0; reservationNumber < reservation.length(); reservationNumber++){ JSONObject jsonObjOrders = reservation.getJSONObject(reservationNumber); orderID = jsonObjOrders.getLong("id_reserva"); status = jsonObjOrders.getInt("estado"); clientID = jsonObjOrders.getLong("id_cliente"); clientName = jsonObjOrders.getString("nombre"); JSONObject equipment = jsonObjOrders.getJSONObject("equipos"); listing = equipment.getJSONArray("listado"); for (int equipmentNumber = 0; equipmentNumber < listing.length(); equipmentNumber++){ JSONObject jsonObjEquipment = listing.getJSONObject(equipmentNumber); detailID = jsonObjEquipment.getLong("id_detalle_reserva"); equipmentTypeID = jsonObjEquipment.getInt("tipo_producto"); equipmentID = jsonObjEquipment.getString("id_equipo"); db.insertEquipment(detailID, equipmentTypeID, equipmentID, orderID); } db.insertOrder(orderID, status, clientID, clientName); } }catch(IllegalStateException e3){ Log.e("IllegalStateException", e3.toString()); e3.printStackTrace(); }catch(JSONException e5){ Log.e("JSONException", e5.toString()); e5.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { try { new AccesoDB().execute(); progressDialog.dismiss(); } catch (Exception e) { Log.e("JSONException", "Error: " + e.toString()); } } }

Page 19: JSON Android

}

User_buttonBien, en este punto nos saldrá algún error, ya que faltan clases y una activity.

4.1 Activity

la activity que falta que es la activity user_button que necesita el adapter para poder hacer la lista es la siguiente:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/user_name" android:textSize="30sp" android:paddingTop="10dp" android:paddingBottom="10dp" android:layout_gravity="center_horizontal" /></LinearLayout>

Con este código nos saldrá la siguiente apariencia:

Page 20: JSON Android

Order

Ahora crearemos la clase Order para hacer la lista, en este caso no necesitamos imports, por lo que empezamos directamente con la clase e inicializando las variables:public class Order { long orderID = 0; int status = 0; long clientID = 0; String clientName = ""; long detailID = 0; int equipmentTypeID = 0; String equipmentID = "";

Ahora empezaremos con las funciones, lo primero que tenemos que hacer es el constructor:public Order(long detailID, int equipmentTypeID, String equipmentID, long orderID){ this.detailID = detailID; this.equipmentTypeID = equipmentTypeID; this.equipmentID = equipmentID; this.orderID = orderID;}

Y seguiremos con las funciones que necesitamos para llamar a cada uno de los items de la lista

Page 21: JSON Android

(Estas funciones las vamos creando según necesidad):public Order (long orderID){ this.orderID = orderID; } public long getOrderID() { return orderID; } public String getEquipmentID(){ return equipmentID; } public int getEquipmentType(){ return equipmentTypeID; } public long getEquipmentDetail() { return detailID; }}

Si os habéis fijado tenemos dos constructores, se pueden hacer varias funciones con el mismo nombre. Ahora el código completo de la clase Orders:public class Order { long orderID = 0; int status = 0; long clientID = 0; String clientName = ""; long detailID = 0; int equipmentTypeID = 0; String equipmentID = ""; public Order(long detailID, int equipmentTypeID, String equipmentID, long orderID){ this.detailID = detailID; this.equipmentTypeID = equipmentTypeID; this.equipmentID = equipmentID; this.orderID = orderID; } public Order (long orderID){ this.orderID = orderID; } public long getOrderID() { return orderID; } public String getEquipmentID(){ return equipmentID; } public int getEquipmentType(){ return equipmentTypeID; } public long getEquipmentDetail() { return detailID; }}

Page 22: JSON Android

DBAbaco

Ahora veremos el codigo de la base de datos DBAbaco.

6.1 Imports

Lo primero es hacer los imports:import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;

6.2 ClaseInicializamos la clase y las variables necesarias para crear una Base de Datos:private static final String TAG = "DBAbaco";public static final String DATABASE_NAME = "AbacoUser";public static final int DATABASE_VERSION = 36;public static final String KEY_USER_NAME = "nombre_usuario";public static final String KEY_USER_PASSWORD = "contraseña_usuario";public static final String KEY_ORDER_ID = "id_pedido";public static final String KEY_ORDER_STATUS = "estado";public static final String KEY_ORDER_STATUS_WORD = "significado";public static final String KEY_CLIENT_ID = "id_cliente";public static final String KEY_DETAIL_EQUIPMENT_ID = "id_detalle";public static final String KEY_EQUIPMENT_ID = "id_equipo";public static final String KEY_EQUIPMENT_CATEGORY = "categoria_equipo";public static final String KEY_EQUIPMENT_DESCRIPTION = "descripcion_equipo";public static final String KEY_CLIENT_NAME = "nombre";public static final String KEY_COMPONENT = "componente";public static final String KEY_COMPONENT_SENT = "componente_enviado";public static final String KEY_COMPONENT_RETURN = "componente_devuelto";public static final String KEY_EQUIPMENT_GAMMA = "Gamma";public static final String KEY_DETAIL_ORDER_ID = "id_detalle_pedido";public static final String TABLE_USER = "Usuarios";public static final String TABLE_ORDER_STATUS = "Estado ordenes";public static final String TABLE_ORDER = "Pedidos";public static final String TABLE_EQUIPMENT = "Equipos";public static final String TABLE_COMPONENT = "Componentes";public static final String TABLE_DETAIL_ORDER = "OrderDetail";private static final String CREATE_TABLE_USER = "CREATE TABLE IF NOT EXISTS " + TABLE_USER + " (" + KEY_USER_NAME + " text not null, " + KEY_USER_PASSWORD + " int(4) not null " + ");";private static final String CREATE_TABLE_ORDER_STATUS = "CREATE TABLE IF NOT EXISTS " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + " int PRIMARY KEY, " + KEY_ORDER_STATUS_WORD + " text not null " + ");";private static final String CREATE_TABLE_ORDER = "CREATE TABLE IF NOT EXISTS " + TABLE_ORDER + " (" + KEY_ORDER_ID + " REAL PRIMARY KEY, " + KEY_ORDER_STATUS + " int not null, " + KEY_CLIENT_ID + " REAL not null, " + KEY_CLIENT_NAME + " NVARCHAR(100) not null "

Page 23: JSON Android

+ "FOREIGN KEY(" + KEY_ORDER_STATUS + ") REFERENCES " + TABLE_ORDER_STATUS + "(" + KEY_ORDER_STATUS + "));";private static final String CREATE_TABLE_EQUIPMENT = "CREATE TABLE IF NOT EXISTS " + TABLE_EQUIPMENT + " (" + KEY_DETAIL_EQUIPMENT_ID + " REAL not null, " + KEY_EQUIPMENT_CATEGORY + " text not null, " + KEY_EQUIPMENT_ID + " INT not null, " + KEY_ORDER_ID + " REAL not null, " + "FOREIGN KEY(" + KEY_ORDER_ID + ") REFERENCES " + TABLE_ORDER + "(" + KEY_ORDER_ID + "));";private static final String CREATE_TABLE_COMPONENT = "CREATE TABLE IF NOT EXISTS " + TABLE_COMPONENT + " (" + KEY_DETAIL_EQUIPMENT_ID + " text not null, " + KEY_COMPONENT + " text not null, " + KEY_COMPONENT_SENT + " text not null, " + KEY_COMPONENT_RETURN + " text not null, " + "FOREIGN KEY(" + KEY_DETAIL_EQUIPMENT_ID + ") REFERENCES " + TABLE_EQUIPMENT + "(" + KEY_DETAIL_EQUIPMENT_ID + "));";private static final String CREATE_TABLE_ORDER_DETAIL = "CREATE TABLE IF NOT EXISTS " + TABLE_DETAIL_ORDER + " (" + KEY_ORDER_ID + " int not null, " + KEY_DETAIL_EQUIPMENT_ID + " text not null, " + "FOREIGN KEY(" + KEY_ORDER_ID + ") REFERENCES " + TABLE_ORDER + "(" + KEY_ORDER_ID + "), " + "FOREIGN KEY(" + KEY_DETAIL_EQUIPMENT_ID + ") REFERENCES " + TABLE_EQUIPMENT + "(" + KEY_DETAIL_EQUIPMENT_ID + "));";public static final int COL_USER = 0;public static final int COL_ORDER_ID = 0;public static final int COL_EQUIPMENT_DETAIL_ID = 0;public static final int COL_EQUIPMENT_CATEGORY = 1;public static final int COL_EQUIPMENT_ID = 2;public static final int COL_EQUIPMENT_ORDER_ID = 3;public static final int COL_ORDER_DETAIL_ID = 0;public static final int COL_ORDER_DETAIL_EQUIPMENT_ID = 1;public static int ORDER_TYPE_OUTGOING = 1;public static int ORDER_TYPE_INCOMING = 2;public final Context context;private DatabaseHelper myDBHelper;protected SQLiteDatabase db;

Si os fijais, la tercera variable es la versión de la base de datos, cambiando esta versión rehace la base de datos entera, ahora viene la funcion del context:public DBAbaco(Context ctx) { this.context = ctx; myDBHelper = new DatabaseHelper(context);}

La siguiente funcion sirve para abrir la Base de Datos:public DBAbaco open() { db = myDBHelper.getWritableDatabase(); return this;}

Y ahora toca cerrarla:public void close() {

Page 24: JSON Android

myDBHelper.close();}

Lo siguiente es crear una clase para la Base de datos:private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }

6.3 Creacion de la DBAhora iremos al onCreate de esta función que es donde crearemos las tablas y crearemos registros por defecto en las tablas:@Overridepublic void onCreate(SQLiteDatabase _db) { _db.execSQL(CREATE_TABLE_USER); _db.execSQL(CREATE_TABLE_ORDER_STATUS); _db.execSQL(CREATE_TABLE_ORDER); _db.execSQL(CREATE_TABLE_EQUIPMENT); _db.execSQL(CREATE_TABLE_COMPONENT); _db.execSQL(CREATE_TABLE_ORDER_DETAIL); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('GORKA', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('IRATXE', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('INMA', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('RAUL', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (0, 'Presupuesto')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (2, 'Confirmado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (3, 'Pagado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (4, 'Enviado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (6, 'Devuelto')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (7, 'Recoger')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (8, 'Fianza devuelta')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (9, 'Comprobado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (10, 'Envio solicitado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (11, 'Devolucion solicitada')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (12, 'Recogido en local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (14, 'Presupuesto')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (15, 'Confirmado

Page 25: JSON Android

local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (16, 'Cancelado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (17, 'Devuelto local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (18, 'Uso en local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (20, 'Email enviado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (21, 'Preparado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (22, 'Cancelado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (23, 'Contrato aceptado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (24, 'Contrato desmarcado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (25, 'Fianza NO devuelta')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (26, 'Devuelto, falta material')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (27, 'Envio fallido')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (28, 'Continua en otra reserva')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (29, 'Ampliacion reserva')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (30, 'Solicitados comentarios')"); }

Otra función que te crea la clase es la siguiente, que en caso de cambiar de versión rehace la base de datos: @Override public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { _db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_ORDER); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_EQUIPMENT); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_COMPONENT); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_DETAIL_ORDER); onCreate(_db); }}

6.4 Funciones

Y aquí acaba la clase de la base de datos. Como os dije antes, aquí están algunas llamadas que

Page 26: JSON Android

se hacen para insertar o consultar en la base de datos, o simplemente rehacer las tablas que necesitamos. En este caso llamamos a dos funciones para rehacer la base de datos:public void dropTables(){ db.execSQL("DROP TABLE IF EXISTS " + TABLE_ORDER); db.execSQL("DROP TABLE IF EXISTS " + TABLE_EQUIPMENT); db.execSQL("DROP TABLE IF EXISTS " + TABLE_COMPONENT); db.execSQL("DROP TABLE IF EXISTS " + TABLE_DETAIL_ORDER);}public void createTables(){ db.execSQL(CREATE_TABLE_ORDER); db.execSQL(CREATE_TABLE_EQUIPMENT); db.execSQL(CREATE_TABLE_COMPONENT); db.execSQL(CREATE_TABLE_ORDER_DETAIL);}

Las siguientes funciones las utilizamos en el JSON para insertar registros en la base de datos, la primera la usaremos para insertar los pedidos en la tabla de pedidos:public void insertOrder(long orderID, int status, long clientID, String clientName){ db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER + " (" + KEY_ORDER_ID + ", " + KEY_ORDER_STATUS + ", " + KEY_CLIENT_ID + ", " + KEY_CLIENT_NAME + ") VALUES (" + orderID + ", " + status + ", " + clientID + ", '" + clientName + "')");}

La segunda funcion la usaremos para insertar los equipos en la tabla de equipos:public void insertEquipment(long detailID, int equipmentTypeID, String equipmentID, long orderID){ db.execSQL("INSERT OR REPLACE INTO " + TABLE_EQUIPMENT + " (" + KEY_DETAIL_EQUIPMENT_ID + ", " + KEY_EQUIPMENT_CATEGORY + ", " + KEY_EQUIPMENT_ID + ", " + KEY_ORDER_ID + ") VALUES (" + detailID + ", " + equipmentTypeID + ", '" + equipmentID + "', " + orderID + ")");}

Con la siguiente funcion cojeremos los datos de la tabla de pedidos para mostrarlos en la lista:public Cursor getOrderListing(int orderType) { String where; if (orderType == ORDER_TYPE_OUTGOING) where = "(" + KEY_ORDER_STATUS + " >= 0 AND " + KEY_ORDER_STATUS + " <= 3) OR (" + KEY_ORDER_STATUS + " >= 18 AND " + KEY_ORDER_STATUS + " <= 23) OR (" + KEY_ORDER_STATUS + " >= 28 AND " + KEY_ORDER_STATUS + " <= 29)"; else where = "(" + KEY_ORDER_STATUS + " >= 4 AND " + KEY_ORDER_STATUS + " <= 17) OR (" + KEY_ORDER_STATUS + " >= 24 AND " + KEY_ORDER_STATUS + " <= 26) OR (" + KEY_ORDER_STATUS + " = 30)"; String sql = "SELECT * FROM " + TABLE_ORDER + " WHERE " + where; return db.rawQuery(sql, new String[]{});}

6.5 CodigoY el codigo completo seria el sguiente:import android.content.ContentValues;import android.content.Context;import android.database.Cursor;

Page 27: JSON Android

import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;

public class DBAbaco { private static final String TAG = "DBAbaco"; public static final String DATABASE_NAME = "AbacoUser"; public static final int DATABASE_VERSION = 36; public static final String KEY_USER_NAME = "nombre_usuario"; public static final String KEY_USER_PASSWORD = "contraseña_usuario"; public static final String KEY_ORDER_ID = "id_pedido"; public static final String KEY_ORDER_STATUS = "estado"; public static final String KEY_ORDER_STATUS_WORD = "significado"; public static final String KEY_CLIENT_ID = "id_cliente"; public static final String KEY_DETAIL_EQUIPMENT_ID = "id_detalle"; public static final String KEY_EQUIPMENT_ID = "id_equipo"; public static final String KEY_EQUIPMENT_CATEGORY = "categoria_equipo"; public static final String KEY_EQUIPMENT_DESCRIPTION = "descripcion_equipo"; public static final String KEY_CLIENT_NAME = "nombre"; public static final String KEY_COMPONENT = "componente"; public static final String KEY_COMPONENT_SENT = "componente_enviado"; public static final String KEY_COMPONENT_RETURN = "componente_devuelto"; public static final String KEY_EQUIPMENT_GAMMA = "Gamma"; public static final String KEY_DETAIL_ORDER_ID = "id_detalle_pedido"; public static final String TABLE_USER = "Usuarios"; public static final String TABLE_ORDER_STATUS = "Estado ordenes"; public static final String TABLE_ORDER = "Pedidos"; public static final String TABLE_EQUIPMENT = "Equipos"; public static final String TABLE_COMPONENT = "Componentes"; public static final String TABLE_DETAIL_ORDER = "OrderDetail"; private static final String CREATE_TABLE_USER = "CREATE TABLE IF NOT EXISTS " + TABLE_USER + " (" + KEY_USER_NAME + " text not null, " + KEY_USER_PASSWORD + " int(4) not null " + ");"; private static final String CREATE_TABLE_ORDER_STATUS = "CREATE TABLE IF NOT EXISTS " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + " int PRIMARY KEY, " + KEY_ORDER_STATUS_WORD + " text not null " + ");"; private static final String CREATE_TABLE_ORDER = "CREATE TABLE IF NOT EXISTS " + TABLE_ORDER + " (" + KEY_ORDER_ID + " REAL PRIMARY KEY, " + KEY_ORDER_STATUS + " int not null, " + KEY_CLIENT_ID + " REAL not null, " + KEY_CLIENT_NAME + " NVARCHAR(100) not null " + "FOREIGN KEY(" + KEY_ORDER_STATUS + ") REFERENCES " + TABLE_ORDER_STATUS + "(" + KEY_ORDER_STATUS + "));"; private static final String CREATE_TABLE_EQUIPMENT = "CREATE TABLE IF NOT EXISTS " + TABLE_EQUIPMENT + " (" + KEY_DETAIL_EQUIPMENT_ID + " REAL not null, " + KEY_EQUIPMENT_CATEGORY + " text not null, " + KEY_EQUIPMENT_ID + " INT not null, " + KEY_ORDER_ID + " REAL not null, " + "FOREIGN KEY(" + KEY_ORDER_ID + ") REFERENCES " + TABLE_ORDER + "(" + KEY_ORDER_ID + "));"; private static final String CREATE_TABLE_COMPONENT = "CREATE TABLE IF NOT EXISTS " + TABLE_COMPONENT + " (" + KEY_DETAIL_EQUIPMENT_ID + " text not null, " + KEY_COMPONENT + " text not null, " + KEY_COMPONENT_SENT + " text not null, "

Page 28: JSON Android

+ KEY_COMPONENT_RETURN + " text not null, " + "FOREIGN KEY(" + KEY_DETAIL_EQUIPMENT_ID + ") REFERENCES " + TABLE_EQUIPMENT + "(" + KEY_DETAIL_EQUIPMENT_ID + "));"; private static final String CREATE_TABLE_ORDER_DETAIL = "CREATE TABLE IF NOT EXISTS " + TABLE_DETAIL_ORDER + " (" + KEY_ORDER_ID + " int not null, " + KEY_DETAIL_EQUIPMENT_ID + " text not null, " + "FOREIGN KEY(" + KEY_ORDER_ID + ") REFERENCES " + TABLE_ORDER + "(" + KEY_ORDER_ID + "), " + "FOREIGN KEY(" + KEY_DETAIL_EQUIPMENT_ID + ") REFERENCES " + TABLE_EQUIPMENT + "(" + KEY_DETAIL_EQUIPMENT_ID + "));"; public static final int COL_USER = 0; public static final int COL_ORDER_ID = 0; public static final int COL_EQUIPMENT_DETAIL_ID = 0; public static final int COL_EQUIPMENT_CATEGORY = 1; public static final int COL_EQUIPMENT_ID = 2; public static final int COL_EQUIPMENT_ORDER_ID = 3; public static final int COL_ORDER_DETAIL_ID = 0; public static final int COL_ORDER_DETAIL_EQUIPMENT_ID = 1; public static int ORDER_TYPE_OUTGOING = 1; public static int ORDER_TYPE_INCOMING = 2; public final Context context; private DatabaseHelper myDBHelper; protected SQLiteDatabase db; public DBAbaco(Context ctx) { this.context = ctx; myDBHelper = new DatabaseHelper(context); } public DBAbaco open() { db = myDBHelper.getWritableDatabase(); return this; } public void close() { myDBHelper.close(); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase _db) { _db.execSQL(CREATE_TABLE_USER); _db.execSQL(CREATE_TABLE_ORDER_STATUS); _db.execSQL(CREATE_TABLE_ORDER); _db.execSQL(CREATE_TABLE_EQUIPMENT); _db.execSQL(CREATE_TABLE_COMPONENT); _db.execSQL(CREATE_TABLE_ORDER_DETAIL); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('GORKA', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('IRATXE', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('INMA', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_USER + " (" + KEY_USER_NAME + ", " + KEY_USER_PASSWORD + ") VALUES ('RAUL', 1234)"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (0, 'Presupuesto')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (2, 'Confirmado')");

Page 29: JSON Android

_db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (3, 'Pagado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (4, 'Enviado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (6, 'Devuelto')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (7, 'Recoger')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (8, 'Fianza devuelta')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (9, 'Comprobado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (10, 'Envio solicitado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (11, 'Devolucion solicitada')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (12, 'Recogido en local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (14, 'Presupuesto')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (15, 'Confirmado local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (16, 'Cancelado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (17, 'Devuelto local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (18, 'Uso en local')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (20, 'Email enviado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (21, 'Preparado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (22, 'Cancelado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (23, 'Contrato aceptado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (24, 'Contrato desmarcado')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (25, 'Fianza NO devuelta')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (26, 'Devuelto, falta material')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (27, 'Envio fallido')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (28, 'Continua en otra reserva')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" +

Page 30: JSON Android

KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (29, 'Ampliacion reserva')"); _db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER_STATUS + " (" + KEY_ORDER_STATUS + ", " + KEY_ORDER_STATUS_WORD + ") VALUES (30, 'Solicitados comentarios')"); } @Override public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { _db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_ORDER); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_EQUIPMENT); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_COMPONENT); _db.execSQL("DROP TABLE IF EXISTS " + TABLE_DETAIL_ORDER); onCreate(_db); } } public void dropTables(){ db.execSQL("DROP TABLE IF EXISTS " + TABLE_ORDER); db.execSQL("DROP TABLE IF EXISTS " + TABLE_EQUIPMENT); db.execSQL("DROP TABLE IF EXISTS " + TABLE_COMPONENT); db.execSQL("DROP TABLE IF EXISTS " + TABLE_DETAIL_ORDER); } public void createTables(){ db.execSQL(CREATE_TABLE_ORDER); db.execSQL(CREATE_TABLE_EQUIPMENT); db.execSQL(CREATE_TABLE_COMPONENT); db.execSQL(CREATE_TABLE_ORDER_DETAIL); } public Cursor getUserListing() { String sql = "SELECT * FROM " + TABLE_USER; return db.rawQuery(sql, new String[]{}); } public void insertOrder(long orderID, int status, long clientID, String clientName){ db.execSQL("INSERT OR REPLACE INTO " + TABLE_ORDER + " (" + KEY_ORDER_ID + ", " + KEY_ORDER_STATUS + ", " + KEY_CLIENT_ID + ", " + KEY_CLIENT_NAME + ") VALUES (" + orderID + ", " + status + ", " + clientID + ", '" + clientName + "')"); } public void insertEquipment(long detailID, int equipmentTypeID, String equipmentID, long orderID){ db.execSQL("INSERT OR REPLACE INTO " + TABLE_EQUIPMENT + " (" + KEY_DETAIL_EQUIPMENT_ID + ", " + KEY_EQUIPMENT_CATEGORY + ", " + KEY_EQUIPMENT_ID + ", " + KEY_ORDER_ID + ") VALUES (" + detailID + ", " + equipmentTypeID + ", '" + equipmentID + "', " + orderID + ")"); } public Cursor getOrderListing(int orderType) { String where; if (orderType == ORDER_TYPE_OUTGOING) where = "(" + KEY_ORDER_STATUS + " >= 0 AND " + KEY_ORDER_STATUS + " <= 3) OR (" + KEY_ORDER_STATUS + " >= 18 AND " + KEY_ORDER_STATUS + " <= 23) OR (" + KEY_ORDER_STATUS + " >= 28 AND " + KEY_ORDER_STATUS + " <= 29)"; else where = "(" + KEY_ORDER_STATUS + " >= 4 AND " + KEY_ORDER_STATUS + " <= 17) OR (" + KEY_ORDER_STATUS + " >= 24 AND " + KEY_ORDER_STATUS + " <= 26) OR (" + KEY_ORDER_STATUS + " = 30)"; String sql = "SELECT * FROM " + TABLE_ORDER + " WHERE " + where; return db.rawQuery(sql, new String[]{}); }

}

Page 31: JSON Android