Cómo usar una base de datos SQLite en Android

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

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.

Cómo usar una base de datos SQLite en Android 1

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.

Cómo usar una base de datos SQLite en Android 3

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.