Curso de Android | Cómo usar una base de datos SQLite 1

Curso de Android
Cómo usar una base de datos SQLite

Curso de Android | Cómo usar una base de datos SQLite 2

Ejecutaremos una vez el siguiente código para que la base de datos aparezca en el file explorer (data → data → nombreDelPaquete → databases)

public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
        
 //La siguiente línea busca la base de datos. Si la encuentra la abre. si no, la crea
 SQLiteDatabase db = openOrCreateDatabase("base_de_datos.db", MODE_PRIVATE, null);
 db.close();
}
  • Para ver la base de datos de nuestra aplicación, iremos a View → Tools Windows → Device File Explorer. Tendré que acceder a data → data → nombre del paquete de la aplicación:

Para crear y manipular nuestra base de datos cómodamente usaremos https://sqlitebrowser.org/.

Instalación en ubuntu:

 sudo apt-get install sqlitebrowser

Usaremos el correspondiente fichero de la base de datos que tiene en su interior ceros y unos, no el que se puede exportar y que tiene código xml.

Sqlite – operaciones

//La siguiente línea busca la base de datos. Si la encuentra la abre. si no, la crea
SQLiteDatabase db = openOrCreateDatabase("base_de_datos.db", MODE_PRIVATE, null);
Cursor c = db.rawQuery("SELECT * FROM usuarios", null);
c. moveToFirst();
Log.d("LEE", c.getString(c.getColumnIndex("campo1")));
c.close();
db.close();

Después de hacer una consulta, si quiero leer los resultados de la misma debo llevar el cursor al punto a partir del cual quiero leer. De lo contrario no funcionará.

Operaciones con parámetros

INSERT
ContentValues nuevoRegistro = new ContentValues();
nuevoRegistro.put("nombre", "Pepe");
nuevoRegistro.put("edad",27);
db.insert("usuarios", null, nuevoRegistro);
UPDATE
ContentValues valores = new ContentValues();
valores.put("nombre","usunuevo");
db.update("usuarios", valores, "id=6", null);
DELETE
db.delete("usuarios", "id=6", null);
db.execSQL("DELETE FROM Usuarios WHERE id=7");
CONSULTA
Cursor c = db.rawQuery("SELECT * FROM usuarios", null);
//Para recorrer un cursor:
while(c.moveToNext()){
 //No debemos hacer el c.moveToFirst(); o nos saltaremos el primer registro.
 Log.d("LEE", c.getString(c.getColumnIndex("nombre")));
 ...

SQLite – precarga base de datos

public class MyApp extends Application {
 @Override
 public void onCreate() {
  super.onCreate();
  File file = this.getDatabasePath("base_de_datos.db");
  if (!file.exists()) {
   file.getParentFile().mkdirs();// Esto crea todas las carpetas para que la ruta a la bd exista. 
   Log.d("paso1", "copiamos la base de datos si no existía antes");
   OutputStream os = null;
   InputStream is = null;
   try {
    is = this.getResources().openRawResource(R.raw.base_de_datos);
    os = new FileOutputStream(file);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = is.read(buffer)) > 0) {
     os.write(buffer, 0, length);
    }
    os.flush();
   } catch (Throwable t) {//e.printStackTrace();
   } finally {
    try {
     if (os != null)
      os.close();
    } catch (IOException e) {//e.printStackTrace();
    }
    if (is != null) {
     try {
      is.close();
     } catch (IOException e) {//e.printStackTrace();
}}}}}} //cierre de llaves.. 

Para cargarlo desde el manifest debemos modificar el nodo application y añadir el atributo: android:name:

<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name=".MyApp"
android:debuggable="false">

Instalar la base de datos con cada actualización de la app

public class MyApp extends Application {
 private boolean hayActualizacion;
 @Override
 public void onCreate() {
  super.onCreate();
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
      int version = prefs.getInt("version", -1);
  try {
   PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
   int posible_nueva_version = pInfo.versionCode;
   if(version<posible_nueva_version){
    hayActualizacion = true;
    SharedPreferences.Editor editor = prefs.edit();
    editor.putInt("version", posible_nueva_version);
    editor.commit();
   }else{
    hayActualizacion = false;
   } 
  } catch (NameNotFoundException e1) {
   e1.printStackTrace();
  }
  if(hayActualizacion){
   ... 

Cargar un listview y un spinner con datos

Para cargar un listView con los datos de una lista (objeto de tipo List):


listView.setAdapter(new ArrayAdapter(this,android.R.layout.simple_list_item_1,lista));

Para cargar un spinner, sería un código similar:

spinner.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,lista));

OnChange de un spinner

Spinner sp = findViewById(R.id.spinner1);
  
sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
 public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  recalcular ();
 
 @Override
 public void onNothingSelected(AdapterView<?> arg0) {
  // TODO Auto-generated method stub
 }
 // add some code here
});

Ejercicio CRUD

Hacer el alta, baja, modificación y consulta de una entidad. Para mostrar los datos usaremos un listview. Para borrar o modificar, usaremos un spinner.

Curso de Android | Cómo usar una base de datos SQLite 3

Ejercicio: plantas

Usaremos un RecyclerView para que escuche cuando hacemos click sobre alguna de sus filas.

public void onBindViewHolder(ViewHolderPlanta viewHolder, int position) {
 viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
   ...
  }
 });
}
startActivity(new Intent(this,InfoActivity.class).putExtra(PLANTA,plantas.get(position)));

Para recoger un Pojo, este debe implementar la interfaz serializable y debemos usar:

Planta planta = (Planta) getIntent().getExtras().getSerializable(MisPlantasActivity.PLANTA);

Ejercicio: plantas II

Añadir un ToggleButton al segundo activity. Al pulsarlo, la planta correspondiente en el activity principal se mostrará pintada de verde. Para ello cambiaremos un campo llamado “is_checked” definido en la base de datos.

Curso de Android | Cómo usar una base de datos SQLite 5