2. 1 JSONParser Para recoger datos de una pagina https sin
comprobar el certificado desde el JSON hay que hacer lo siguiente.
1.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; 1.2 Clase Y 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; } };
3. Ahora crearemos la funcion para aceptar todos los
verificados: 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"); 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 conexin. Desde la clase que
llama a JSONParser le pasamos la URL y el mtodo (GET, PUT, POST,
etc...) as que sabiendo esto empezamos la funcin: 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 conexin 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 conexin 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);
4. Una vez descargados terminamos las excepciones y metemos los
datos en un JSONObject: } 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; } } 1.3 Codigo El cdigo 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 { }
6. 2 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 despus ponerlo en
pantalla. 2.1 Activity Dicho esto creamos una activity nueva que
tendr una lista y un botn de actualizar los datos del JSON:
7. Nos debera quedar una pantalla de la siguiente manera:
8. 2.2 Clase Una vez hecha ya la activity procederemos a
configurar el codigo. 2.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; 2.2.2 Clase Empezamos
la clase inicializando las variables: public class OrdersActivity
extends ActionBarActivity { private List ordersList = new
ArrayList(); int orderType = 0; String myUrl =
"https://******************************"; JSONParser jParser = new
JSONParser(); JSONArray reservation = null; JSONArray listing =
null; Button btnUpdate; DBAbaco db;
9. Ahora haremos el onCreate que preparara el botn de
actualizar para sacar la lista de pedidos de la 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(); } A continuacin tenemos las opciones por
defecto al crear una activity que no tocaremos: @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); 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); } Llamaremos a la funcion
setupUpdateButton() que tendr el siguiente cdigo: private void
setupUpdateButton(){ btnUpdate = (Button)
findViewById(R.id.updateButton); btnUpdate.setOnClickListener(new
OnClickListener() { @Override public void onClick(View v) { new
LoadAllOrders().execute(); } }); }
10. 2.2.3 JSON Esta funcin prepara el botn 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 lo haremos en una tarea Asncrona, 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 { 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 funcin lo que haremos sera poner un cuadro de
dialogo de cargando mientras se descargan los datos del JSON. Ahora
pondremos la funcin 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 cdigo y limpiaremos las
listas y las tablas: @Override protected 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");
11. 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: Primeramente, el nombre de JSON no se coge,
digamos que es el inicial. Se empezara 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 tendra un item, el cdigo 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 posicin,
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++){
12. Nos recorremos el array: JSONObject jsonObjEquipment =
listing.getJSONObject(equipmentNumber); Cogemos los items del nuevo
array: detailID = jsonObjEquipment.getLong("id_detalle_reserva");
equipmentTypeID = jsonObjEquipment.getInt("tipo_producto");
equipmentID = jsonObjEquipment.getString("id_equipo"); A
continuacin como ya tenemos todos los items del array los guardamos
en ls DB que posteriormente explicaremos la funcin:
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 funcin para que cuando
finalice la funcin principal haga lo que le digamos, la funcin es
la siguiente: @Override protected void onPostExecute(String s) {
try { new AccesoDB().execute(); progressDialog.dismiss(); } catch
(Exception e) { Log.e("JSONException", "Error: " + e.toString()); }
} } 2.2.4 AcesoDB En esta funcin lo que hacemos es pasar a otra
tarea en segundo plano para sacar lo que tenemos guardado y meterlo
en una lista. La mecnica de la clase es la misma, primero
inicializar las variables: public class AccesoDB extends AsyncTask
{ private ProgressDialog progressDialog = new
ProgressDialog(OrdersActivity.this);
13. Ahora haremos la funcin que hace que salga un cuadro de
dialogo con la descripcin de cargando: protected void
onPreExecute() { progressDialog.setMessage("Descargando
pedidos..."); progressDialog.show();
progressDialog.setOnCancelListener(new
DialogInterface.OnCancelListener() { public void
onCancel(DialogInterface arg0) { AccesoDB.this.cancel(true); } });
} Despus iremos con la funcin principal que nos descargara los
datos de la DB a la lista: @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; } Y para acabar haremos la ultima funcin que se har
cuando acabe la funcin principal: @Override protected void
onPostExecute(Boolean s) { setupOrdersListView();
registerClickCallback(); progressDialog.dismiss(); } } 2.2.5 Lista
Esta funcin llama a otras funciones que no estn en la tarea en
segundo plano ya que no cargan mucho, por eso las colocaremos mas
arriba (Cuando acabe os pondr el cdigo entero). La funcin seria la
siguiente: private void setupOrdersListView() { orderListAdapter
adapter = new orderListAdapter(this, ordersList); ListView lvOrders
= (ListView) findViewById(R.id.ordersListing);
lvOrders.setAdapter(adapter); }
14. Esta funcin cargara la lista en la pantalla mediante un
adapter: private class orderListAdapter extends ArrayAdapter {
public orderListAdapter(Context context, List 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; } } Una vez cargada la lista y los items se muestren en
la pantalla la siguiente funcin registrara el poder clickear los
items de la lista. Llamaremos a la funcin 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: @Override public 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 funcin 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(); }
15. 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()));
b.putString("orderType", String.valueOf(orderType));
intent.putExtras(b); startActivity(intent); } }); } 2.2.6 Codigo
Habriamos terminado de programar la clase de la actividad que
muestra la lista, el cdigo 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 ordersList
= new ArrayList(); 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();
16. 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); 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() {
17. 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 { public
orderListAdapter(Context context, List 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 { 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();
19. 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()); }
} } } 3 User_button Bien, en este punto nos saldr algn error, ya
que faltan clases y una activity. 3.1 Activity la activity que
falta que es la activity user_button que necesita el adapter para
poder hacer la lista es la siguiente:
20. Con este cdigo nos saldr la siguiente apariencia: 4 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; }
21. Y seguiremos con las funciones que necesitamos para llamar
a cada uno de los items de la lista (Estas funciones las vamos
creando segn 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 habis fijado
tenemos dos constructores, se pueden hacer varias funciones con el
mismo nombre. Ahora el cdigo 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; } }
22. 5 DBAbaco Ahora veremos el codigo de la base de datos
DBAbaco. 5.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; 5.2 Clase Inicializamos
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 =
"contrasea_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, "
23. + 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, " + 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 versin de la base de datos, cambiando esta versin 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; }
24. Y ahora toca cerrarla: public void close() {
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); } 5.3 Creacion de la DB
Ahora iremos al onCreate de esta funcin que es donde crearemos las
tablas y crearemos registros por defecto en las tablas: @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')");
_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')");
25. _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 + " (" + 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 funcin que te crea la clase es
la siguiente, que en caso de cambiar de versin 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); } }
26. 5.4 Funciones Y aqu acaba la clase de la base de datos.
Como os dije antes, aqu estn algunas llamadas que 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 + " = 18 AND " + KEY_ORDER_STATUS + " = 28 AND
" + KEY_ORDER_STATUS + " = 4 AND " + KEY_ORDER_STATUS + " = 24 AND
" + KEY_ORDER_STATUS + " = 0 AND " + KEY_ORDER_STATUS + " = 18 AND
" + KEY_ORDER_STATUS + " = 28 AND " + KEY_ORDER_STATUS + " = 4 AND
" + KEY_ORDER_STATUS + " = 24 AND " + KEY_ORDER_STATUS + "