SlideShare a Scribd company logo
Í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
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 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;
}
};
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 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) {
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 Codigo
El 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");
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
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:
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
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 continuación tenemos las opciones por defecto al crear una activity que no tocaremos:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this addsitems 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 clickshere. The action bar will
// automatically handle clickson 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
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:
@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");
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 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);
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...");
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:
@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 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ánen 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);
}
@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:
@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 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()));
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 addsitems 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 clickshere. The action bar will
// automatically handle clickson 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> {
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();
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());
}
}
}
}
User_button
Bien, 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:
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
(Estas funciones las vamos creando segúnnecesidad):
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;
}
}
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 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 = "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, "
+ 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() {
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 DB
Ahora iremos al onCreate de esta función 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')");
_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 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
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 Codigo
Y el codigo completo seria el sguiente:
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
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, "
+ 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')");
_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 + " (" +
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[]{});
}
}

More Related Content

What's hot

Blockchain: Developer Perspective
Blockchain: Developer PerspectiveBlockchain: Developer Perspective
Blockchain: Developer Perspective
Artur Skowroński
 
Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1
Zianed Hou
 
Building Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDBBuilding Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDB
MongoDB
 
Easy Button
Easy ButtonEasy Button
Easy Button
Adam Dale
 
Fia fabila
Fia fabilaFia fabila
Fia fabila
fiafabila
 
201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harian201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harian
KhairunnisaPekanbaru
 
How to get rid of terraform plan diffs
How to get rid of terraform plan diffsHow to get rid of terraform plan diffs
How to get rid of terraform plan diffs
Yukiya Hayashi
 
It's 10pm: Do You Know Where Your Writes Are?
It's 10pm: Do You Know Where Your Writes Are?It's 10pm: Do You Know Where Your Writes Are?
It's 10pm: Do You Know Where Your Writes Are?
MongoDB
 
BDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web TestingBDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web Testing
John Ferguson Smart Limited
 
Secure Communications with VisualWorks - CSTUC 2006
Secure Communications with VisualWorks - CSTUC 2006Secure Communications with VisualWorks - CSTUC 2006
Secure Communications with VisualWorks - CSTUC 2006
Martin Kobetic
 
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
5 6
 
Tugas 2
Tugas 2Tugas 2
Tugas 2
Novi_Wahyuni
 
Nancy + rest mow2012
Nancy + rest   mow2012Nancy + rest   mow2012
Nancy + rest mow2012
Christian Horsdal
 
2019-10-05 - Untangled - Voxxed days ticino
2019-10-05 - Untangled - Voxxed days ticino2019-10-05 - Untangled - Voxxed days ticino
2019-10-05 - Untangled - Voxxed days ticino
Arnaud Bos
 
Circuit breaker
Circuit breakerCircuit breaker
Circuit breaker
bricemciver
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
Ryosuke Uchitate
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Kiyotaka Oku
 
MongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB Performance Debugging
MongoDB Performance Debugging
MongoDB
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-es
MongoDB
 
"Auth for React.js APP", Nikita Galkin
"Auth for React.js APP", Nikita Galkin"Auth for React.js APP", Nikita Galkin
"Auth for React.js APP", Nikita Galkin
Fwdays
 

What's hot (20)

Blockchain: Developer Perspective
Blockchain: Developer PerspectiveBlockchain: Developer Perspective
Blockchain: Developer Perspective
 
Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1
 
Building Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDBBuilding Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDB
 
Easy Button
Easy ButtonEasy Button
Easy Button
 
Fia fabila
Fia fabilaFia fabila
Fia fabila
 
201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harian201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harian
 
How to get rid of terraform plan diffs
How to get rid of terraform plan diffsHow to get rid of terraform plan diffs
How to get rid of terraform plan diffs
 
It's 10pm: Do You Know Where Your Writes Are?
It's 10pm: Do You Know Where Your Writes Are?It's 10pm: Do You Know Where Your Writes Are?
It's 10pm: Do You Know Where Your Writes Are?
 
BDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web TestingBDD, ATDD, Page Objects: The Road to Sustainable Web Testing
BDD, ATDD, Page Objects: The Road to Sustainable Web Testing
 
Secure Communications with VisualWorks - CSTUC 2006
Secure Communications with VisualWorks - CSTUC 2006Secure Communications with VisualWorks - CSTUC 2006
Secure Communications with VisualWorks - CSTUC 2006
 
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
 
Tugas 2
Tugas 2Tugas 2
Tugas 2
 
Nancy + rest mow2012
Nancy + rest   mow2012Nancy + rest   mow2012
Nancy + rest mow2012
 
2019-10-05 - Untangled - Voxxed days ticino
2019-10-05 - Untangled - Voxxed days ticino2019-10-05 - Untangled - Voxxed days ticino
2019-10-05 - Untangled - Voxxed days ticino
 
Circuit breaker
Circuit breakerCircuit breaker
Circuit breaker
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 
MongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB Performance Debugging
MongoDB Performance Debugging
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-es
 
"Auth for React.js APP", Nikita Galkin
"Auth for React.js APP", Nikita Galkin"Auth for React.js APP", Nikita Galkin
"Auth for React.js APP", Nikita Galkin
 

Similar to JSON Android

Jason parsing
Jason parsingJason parsing
Jason parsing
parallelminder
 
Securing your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris KelloggSecuring your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris Kellogg
StreamNative
 
Client server part 12
Client server part 12Client server part 12
Client server part 12
fadlihulopi
 
Speed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsSpeed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSockets
Yakov Fain
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinner
Truls Jørgensen
 
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Julian Robichaux
 
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
panagenda
 
Durable functions 2.0 (2019-10-10)
Durable functions 2.0 (2019-10-10)Durable functions 2.0 (2019-10-10)
Durable functions 2.0 (2019-10-10)
Paco de la Cruz
 
Test-driven Development with AEM
Test-driven Development with AEMTest-driven Development with AEM
Test-driven Development with AEM
Jan Wloka
 
Tdd iPhone For Dummies
Tdd iPhone For DummiesTdd iPhone For Dummies
Tdd iPhone For Dummies
Giordano Scalzo
 
OWASP Proxy
OWASP ProxyOWASP Proxy
OWASP Proxy
Security B-Sides
 
Asynchronen Code testen
Asynchronen Code testenAsynchronen Code testen
Asynchronen Code testen
ndrssmn
 
Swift LA Meetup at eHarmony- What's New in Swift 2.0
Swift LA Meetup at eHarmony- What's New in Swift 2.0Swift LA Meetup at eHarmony- What's New in Swift 2.0
Swift LA Meetup at eHarmony- What's New in Swift 2.0
Claire Townend Gee
 
JavaScript Lessons 2023
JavaScript Lessons 2023JavaScript Lessons 2023
JavaScript Lessons 2023
Laurence Svekis ✔
 
Reactive server with netty
Reactive server with nettyReactive server with netty
Reactive server with netty
Dmitriy Dumanskiy
 
CIS14: Developing with OAuth and OIDC Connect
CIS14: Developing with OAuth and OIDC ConnectCIS14: Developing with OAuth and OIDC Connect
CIS14: Developing with OAuth and OIDC Connect
CloudIDSummit
 
An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based Testing
C4Media
 
Azure Durable Functions (2019-03-30)
Azure Durable Functions (2019-03-30) Azure Durable Functions (2019-03-30)
Azure Durable Functions (2019-03-30)
Paco de la Cruz
 
Web CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docx
Web CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docxWeb CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docx
Web CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docx
celenarouzie
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
wonyong hwang
 

Similar to JSON Android (20)

Jason parsing
Jason parsingJason parsing
Jason parsing
 
Securing your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris KelloggSecuring your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris Kellogg
 
Client server part 12
Client server part 12Client server part 12
Client server part 12
 
Speed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsSpeed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSockets
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinner
 
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
 
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
 
Durable functions 2.0 (2019-10-10)
Durable functions 2.0 (2019-10-10)Durable functions 2.0 (2019-10-10)
Durable functions 2.0 (2019-10-10)
 
Test-driven Development with AEM
Test-driven Development with AEMTest-driven Development with AEM
Test-driven Development with AEM
 
Tdd iPhone For Dummies
Tdd iPhone For DummiesTdd iPhone For Dummies
Tdd iPhone For Dummies
 
OWASP Proxy
OWASP ProxyOWASP Proxy
OWASP Proxy
 
Asynchronen Code testen
Asynchronen Code testenAsynchronen Code testen
Asynchronen Code testen
 
Swift LA Meetup at eHarmony- What's New in Swift 2.0
Swift LA Meetup at eHarmony- What's New in Swift 2.0Swift LA Meetup at eHarmony- What's New in Swift 2.0
Swift LA Meetup at eHarmony- What's New in Swift 2.0
 
JavaScript Lessons 2023
JavaScript Lessons 2023JavaScript Lessons 2023
JavaScript Lessons 2023
 
Reactive server with netty
Reactive server with nettyReactive server with netty
Reactive server with netty
 
CIS14: Developing with OAuth and OIDC Connect
CIS14: Developing with OAuth and OIDC ConnectCIS14: Developing with OAuth and OIDC Connect
CIS14: Developing with OAuth and OIDC Connect
 
An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based Testing
 
Azure Durable Functions (2019-03-30)
Azure Durable Functions (2019-03-30) Azure Durable Functions (2019-03-30)
Azure Durable Functions (2019-03-30)
 
Web CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docx
Web CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docxWeb CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docx
Web CrawlersrcedusmulylecrawlerController.javaWeb Crawler.docx
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
 

JSON Android

  • 1. Í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
  • 2. 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 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; } }; Ahora crearemos la funcion para aceptar todos los verificados: private static void trustAllHosts(){
  • 3. 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) { e.printStackTrace(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString());
  • 4. } try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } return jObj; } } 2.3 Codigo El 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"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace();
  • 5. } } 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 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"
  • 7.
  • 8. 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
  • 9. 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 continuación tenemos las opciones por defecto al crear una activity que no tocaremos: @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this addsitems 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 clickshere. The action bar will // automatically handle clickson 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 lo haremos en una tarea Asíncrona, es decir, en segundo plano. Como es otra clase dentro de
  • 10. 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: @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"); 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:
  • 11. 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); Cogemos los items del nuevo array: detailID = jsonObjEquipment.getLong("id_detalle_reserva"); equipmentTypeID = jsonObjEquipment.getInt("tipo_producto");
  • 12. 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..."); progressDialog.show(); progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface arg0) { AccesoDB.this.cancel(true); }
  • 13. }); } Después iremos con la función 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 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ánen 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); } @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);
  • 14. } 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: @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 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())); b.putString("orderType", String.valueOf(orderType)); intent.putExtras(b); startActivity(intent); } }); }
  • 15. 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 addsitems 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 clickshere. The action bar will // automatically handle clickson the Home/Up button,so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId();
  • 16. //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> { 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; }
  • 17. } 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(); 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);
  • 18. 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()); } } } } User_button Bien, 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" />
  • 19. </LinearLayout> Con este código nos saldrá la siguiente apariencia: 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 = "";
  • 20. 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 (Estas funciones las vamos creando segúnnecesidad): 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;
  • 21. } } 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 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 = "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
  • 22. + " (" + 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, " + 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() {
  • 23. db = myDBHelper.getWritableDatabase(); return this; } 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); } 6.3 Creacion de la DB Ahora iremos al onCreate de esta función 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')"); _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 + " (" +
  • 24. 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 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 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);
  • 25. 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 Codigo Y el codigo completo seria el sguiente: import android.content.ContentValues; import android.content.Context; import android.database.Cursor; 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";
  • 26. 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, " + 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;
  • 27. 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')"); _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 + " (" +
  • 28. 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 + " (" + 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 + ", " +
  • 29. 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[]{}); } }