Ir al contenido principal

BDate Parte 8 - Actualizando la nota

Nuestra app, ya funciona de manera adecuada, lo que nos hace falta es poder editarla en un futuro y poder eliminarla de manera que no afecte a las demás notas, en esta ocasión haremos lo primero.

Para comenzar necesitamos agregar otro método a nuestra clase DBAdapter.java


public boolean updateNota(long row, String tit, String nota)
 {
  ContentValues arg = new ContentValues();
  arg.put(KEY_TITULO, tit);
  arg.put(KEY_NOTA, nota);
  return db.update(DATABASE_TABLE, arg, KEY_ROWID+"="+row, null) > 0;
 }
Con esto conseguiremos actualizar los elementos de una nota en la base de datos.
Volvemos a retocar la clase NotasList.java para que se actualice la lista, esto por si actualizamos el titulo de la nota selecciona, si se fijan bien, se trata del método onItemClick, que es el ultimo que estuvimos trabajando en la entrada pasada.
public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
  // TODO Auto-generated method stub
  
  //borramos el contenido de resultados
  resultados.clear();
  
  Intent i = new Intent(NotasList.this, Leer.class);
  i.putExtra("ID", arg2+1);
  //startActivity(i);
/*
hacemos un intent con, el metodo de abajo, no es la forma correcta de usarlo
pero sirve para nuestros fines, contiene 2 parametros
el primero el intent hacia la actividad que desplegara
el segundo un ID que le indica de donde va
*/
  startActivityForResult(i, 0);
 }


//este metodo sobreescrito se utiliza para recuperar el id del intent de arriba
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);
//preguntamos si el id, es el mismo que mandamos
  if(resultCode==0)
  {
//volvemos a abrir y recargar la lista 
   abrirDBAdapter();
         
         mostrarResultados();
  }
 }
Recordemos que estoy usando un script para mostrar el codigo, asi que por cualquier anomalia dejare el codido completo de esta ocacion en la parte de abajo.

Ahora trabajamos el layout de mostrar nota, en donde simplemente le agregaremos un botón que nos indique, que queremos editar la nota.


Estéticamente no se ve bien, pero ustedes lo pueden mejorar de tal forma que quede agradable a la vista. Lo único que he agregado es el siguiente código.

Cortando el textview que representa el titulo, agregando un tablerow, en donde se agrega un boton y el textview que cortamos. así de simple.


Llegados hasta acá, hay una doble decisión, para editar o actualizar la nota

  1. Usar la clase Crear.java
  2. Crear una clase Editar.java
Si usamos la clase Crear.java, tendremos que implementar algún tipo de bandera, para saber si el usuario esta creando o esta actualizando la nota.

En cambio si decidimos crear una clase Editar.java, estaremos haciendo muchas redundancias, pero para el iniciado en la programación, quedaría perfecto, así que usaremos la segunda.


En esta clase Editar.java, usaremos uno de nuestros layout previamente creados con anterioridad (ahorrando código), el llamado crear.xml, recordemos que cada clase que interactué con el usuario tiene que ser agregado al AndroidManifest como una actividad, así que no olvidemos este punto importante. El código queda de la siguiente manera.
package com.nayosx.nl;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Editar extends Activity implements OnClickListener{
 private Button guardar, cancelar;
 private EditText titulo, nota;
 private String titu;
 private DBAdapter myAdapBD;
 
//esta variable recupera el id de la base de datos
 int row = 0;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.crear);
  inicializar();
 }
 private void inicializar()
 {
  myAdapBD = new DBAdapter(this);
  guardar = (Button) findViewById(R.id.bGuardar);
  cancelar = (Button) findViewById(R.id.bCancelar);
  
  titulo = (EditText)findViewById(R.id.titulo);
  nota = (EditText)findViewById(R.id.nota);
  
//recuperamos todo el contenido de intent que mandamos 
  Bundle bl = getIntent().getExtras();

//inicializamos el row
  row = bl.getInt("ID");
  myAdapBD.abrir();

//le indicamos que queremos recuperar de la base de datos
  Cursor c = myAdapBD.getNota(row);

//indicamos que se inicializara
  titulo.setText(c.getString(1));
  nota.setText(c.getString(2));
  myAdapBD.cerrar();
  
  
  guardar.setOnClickListener(this);
  cancelar.setOnClickListener(this);
 }
 

//todo lo demas es muy parecido a Crear.java
 public void onClick(View v) {
  // TODO Auto-generated method stub
  switch(v.getId())
  {
  case R.id.bGuardar:
   titu = titulo.getText().toString();
   if(! titu.equals(""))
   {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Estas seguro de actualizar la nota")
           .setCancelable(false)
           .setPositiveButton("Actualizar", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                guardarArchivo();
//aqui cambia de Crear.this.finish() a 
                   Editar.this.finish();
               }
           })
           .setNegativeButton("Editar", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
   }
   break;
  case R.id.bCancelar:
   finish();
   break;
  }
 }
 private void guardarArchivo() {
  // TODO Auto-generated method stub
  try {
   myAdapBD.abrir();

//en vez de insertar la nota la actualizamos con el metodo que agregamos al inicio de este post
   myAdapBD.updateNota(row, titu, nota.getText().toString());
   //myAdapBD.insertarNotas(titu, nota.getText().toString());
   myAdapBD.cerrar();
  } catch (SQLiteException se ) {
         Log.e(getClass().getSimpleName(), "No se ha podido actualizar la nota");
        }

 }

}

Es identico a Crear.java, con algunas variables extras nada mas, pero antes al botón que creamos en leer.xml  (al inicio de este pos) hay que indicarle que tiene que llevar el ID (esto en la clase Leer.java) de la nota que queremos editar, asi que hacemos uso de la interface OnClickListener y dentro del metodo que se crea, agregamos el siguiente codigo
package com.nayosx.nl;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Leer extends Activity implements OnClickListener{
 private TextView mostrar, titu;

 String titulo ="", nota = "";
 
 DBAdapter db ;
 
 
 Button editar;
 
 int id = 0;
 
 
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.leer);
  inicializar();
 }
 private void inicializar()
 {
  db = new DBAdapter(this);
  mostrar = (TextView) findViewById(R.id.mostrar);
  titu = (TextView) findViewById(R.id.titulo);
  
  
  
  editar = (Button) findViewById(R.id.beditarNota);
  
  db.abrir();
  Cursor c;
  Bundle bl = getIntent().getExtras();
  
  
  //inicializamos el id, para luego mostrar el contenido deseado
  id = bl.getInt("ID");
  c = db.getNota(id);
  
  
  
  titu.setText(c.getString(1));
  mostrar.setText(c.getString(2));
  db.cerrar();
  
  
  editar.setOnClickListener(this);
 }
 public void onClick(View v) {
  // TODO Auto-generated method stub
  Intent i = new Intent(Leer.this, Editar.class);
  i.putExtra("ID", id);

//hacemos algo similar con lo de NotasList.java
  startActivityForResult(i,0);
  //startActivity(i);
 }
 
 

//sobreescribimos el mismo metodo 
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);

//al regresar a esta actividad verificamos que se trata del id correspondiente
  if(resultCode==0)
  {

//luego, simplemente inicializamos todo  de nuevo
   inicializar();
  }
 }
 
}



Y eso es todo por esta ocasion.

El código completo para esta ocasión esta aquí 

Entradas populares de este blog

Northwind para Mysql y otras

Supongamos que necesitamos una base de datos para comenzar a hacer pruebas y a la vez necesitamos que esa base de datos contenga mucha información con la cual trabajar. En mis tiempos de universidad existía una base de datos que utilizábamos en los laboratorios con SQL Server y c# para mostrar los datos en algún formulario. El nombre era Northwind. El problema es que era solo para SQL Server, pero alguien en se dio a la tarea de exportar esa base de datos a MySql y es justo lo que te vengo a mostrar acá. Hace un tiempo atrás clone de los repositorios de Google Code   esa información (que como algunos de ustedes sabrá dejara de estar al servicio de todos en un tiempo). Modifique un poco la DB de Mysql para que se pudiera ejecutar el script sin ningún problema. Lo interesante de todo esto es que puedes utilizar los demás script para diferentes gestores de base de datos Se advierte que para poder usarlas adecuadamente hay que modificar los campos de tipo longblob y qu...

How to upload File from form data POST in Android with Retrofit 2

 The last day I explain how to upload a simple CSV file using node . And now I teach how to upload from android device. Get source code here:  GitHub This article is write in java... later I'll add the method for kotlin. The logic is not changed, only the format code. 1) Is necessary add the dependencies in gradle: module implementation 'com.google.code.gson:gson:2.8.6' // RETROFIT // implementation 'com.squareup.retrofit2:retrofit:2.6.2' implementation 'com.squareup.retrofit2:converter-gson:2.6.2' implementation 'com.squareup.retrofit2:converter-scalars:2.5.0' 2) Add permissions in AndroidManifest.xml and modified the application for work with network security policy <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> in applitacion add ...

Instalacion de apk desde el adb (Linux y Windows)

Por lo general siempre instalamos nuestras aplicaciones por medio de algún gestor oh tienda de aplicaciones como el Google Play oh F-Droid por mencionar a algunos. Pero que pasa cuando no podemos acceder a esas tiendas y hemos modificado algunas cosas del sistema como por ejemplo la eliminación del teclado, por el simple hecho de que no nos gusta, oh a ver quitado el propio launcher del sistema, aunque suene ilógico hay personas que lo hacen (yo por ejemplo lo he hecho a modo de prueba en un Kiosera que tuve, ya que me pareció demasiado pesado y lelo el launcher y el teclado por defecto y llegue a una optimizacion del SO de un 100%). Quizás eso es lo mejor de Android, el completo control que este te da si eres root, sin mas preámbulo te muestro como instalar las apk por medio del ADB de Android. Pero antes de que los vea me gustaría aclarar que esto es aplicable tanto para dispositivos físicos como emuladores, en el caso de ser dispositivos físicos asegúrate de tener los dr...