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