SQLite

Curso de Android

2.  
3.  
4.  
6.  
7.  
9.  
11.  
13.  
14.  
15.  
16.  
17.  

Contactar con el profesor

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("nombre_base_datos", MODE_PRIVATE, null);
	db.close();
}
  • Para editar un fichero del file explorer (por ejemplo el archivo correspondiente a la base de datos sqlite) debo pulsar el icono correspondiente dentro del panel file explorer (View → Tools Windows → → Device File Explorer). Tendré que acceder a data -> nombre del paquete de la aplicación:
  • Pull para sacar el fichero seleccionado.
  • Push para introducir el fichero seleccionado.

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("nombre_base_datos", MODE_PRIVATE, null);
Cursor c = db.rawQuery("SELECT * FROM MyTable", 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_campo1", "6");
nuevoRegistro.put("nombre_campo2","Pepe");
db.insert("Usuarios", null, nuevoRegistro);
UPDATE
ContentValues valores = new ContentValues();
valores.put("nombre","usunuevo");
db.update("Usuarios", valores, "codigo=6", null);
DELETE
db.delete("Usuarios", "codigo=6", null);
db.execSQL("DELETE FROM invitado WHERE nombre=' pp'");
CONSULTA
Cursor c = db.rawQuery("SELECT * FROM MyTable", 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("campo1")));
	...

SQLite – precarga base de datos

public class MyApp extends Application {
	@Override
	public void onCreate() {
		super.onCreate();
		File file = this.getDatabasePath("nombre_base_datos");
		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.nombre_base_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.

SQLite 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.

SQLite 3
← Almacenar info
Multimedia →

Aviso Legal | Política de privacidad