Prácticas recomendadas para bases de datos de Android

Mi aplicación de Android necesita una base de datos local. ¿Cuál es la mejor manera para esto? Que clase sub I utilizar, subclase, reimplementar, etc He encontrado demasiada información en la red, pero todavía no sé cuáles son las mejores prácticas.

Es una pregunta bastante amplia y depende un poco de su nivel de experiencia y uso.

Pero la práctica común es crear su propio ContentProvider que abstraerá el acceso a la base de datos. De esta manera puede utilizar Uri para ejecutar select / update / delete / insert queries.

Para la base de datos SQLite, use SQLiteOpenHelper para abstraer la creación y actualización de su base de datos SQLite. Esto le permitirá actualizar su base de datos sin que el usuario pierda todos sus datos de una manera fácil.

Puedo adjuntar un pedazo de código que utilicé en uno de mis proyectos más antiguos que te ayudarán a empezar. Pero la implementación de todo puede estar fuera del alcance de una sola pregunta / respuesta.

 public class MyServiceProvider extends ContentProvider { private SQLiteDatabase db; @Override public boolean onCreate() { // Initialize the database and assign it to the private variable MyDatabaseHelper sqlHelper = new MyDatabaseHelper(getContext()); db = sqlHelper.getReadableDatabase(); return (db == null)?false:true; } @override Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // handle the query here, form it, do your checks and then access the DB db.query(....); } } class MyDatabaseHelper extends SQLiteOpenHelper { private static final String LOG_TAG = "MyAppTag"; private static final String DB_NAME = "Databasename"; private static final String TABLE_NAME = "Tablename"; private static final int DATABASE_VERSION = 2; public static MyServiceProvider.CONTENT_URI = Uri.parse("content://com.mycompany.myApp.MyAppService/myTableOrIdentifier"); public MyDatabaseHelper(Context context){ super(context, DB_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE IF NOT EXISTS ...."; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Here you can perform updates when the database structure changes // Begin transaction db.beginTransaction(); try { if(oldVersion<2){ // Upgrade database structure from Version 1 to 2 String alterTable = "ALTER ...."; db.execSQL(alterTable); Log.i(LOG_TAG,"Successfully upgraded to Version 2"); } // This allows you to upgrade from any version to the next most // recent one in multiple steps as you don't know if the user has // skipped any of the previous updates if(oldVersion<3){ // Upgrade database structure from Version 2 to 3 String alterTable = "ALTER ...."; db.execSQL(alterTable); Log.i(LOG_TAG,"Successfully upgraded to Version 3"); } // Only when this code is executed, the changes will be applied // to the database db.setTransactionSuccessful(); } catch(Exception ex){ ex.printStackTrace(); } finally { // Ends transaction // If there was an error, the database won't be altered db.endTransaction(); } } } 

Y luego puede utilizar cursores para interactuar con la base de datos.

 ContentResolver contentResolver = getContentResolver(); ... Cursor c = contentResolver.query( // The Uri results in content://com.mycompany.myApp.MyAppService/myTableOrIdentifier/someId Uri.withAppendedPath(MyServiceProvider.CONTENT_URI, someId), new String[] { // only get fields we need! "MyDbFieldIneed" }, null, null, null); 

Esto le devolverá un Cursor que le permitirá iterar y obtener los resultados. Esto también es cómo la mayoría de las cosas en Android se implementan (es decir, obtener una dirección de la libreta de direcciones funciona a través de Uri y Cursor también).

Edit: Me di cuenta de que los enlaces son difíciles de ver con los puntos culminantes del código. Aquí el enlace de las clases importantes que necesitará.

  • ContentProvider | Desarrolladores de Android
  • SQLiteOpenHelper | Desarrolladores de Android
  • Cursor | Desarrolladores de Android
  • UriMatcher | Desarrolladores de Android

Editar 2: También si trabajas con varias tablas, UriMatcher es una fuente importante también

Supongo que la mejor manera de usar bases de datos SQLite es usar ContentProviders. Al buscarlo, verá que ContentProvider API es muy complicado. Pero hay una biblioteca muy buena que hace que el proceso sea muy fácil. Se llama ProviGen y usted puede encontrar una información detallada sobre el mismo en el siguiente enlace.

https://github.com/TimotheeJeannin/ProviGen

Es muy fácil de usar. Sólo creará una clase de contrato en la que indicará qué columnas necesita en la base de datos mediante anotación y creará todo automáticamente. Incluso puedo crear múltiples tablas en una base de datos.

Which is the best manner for this?
Necesitas usar SQLite que viene con Android. Cada aplicación de Android puede tener su propia base de datos.

which class sub I use, subclass, reimplement,
Necesita extender la clase SQLiteOpenHelper que determina cuál es el nombre de su base de datos, cómo se actualiza / desactualiza, cómo se estructuran las tablas y así sucesivamente. También define métodos para obtener una referencia a la base de datos.

Sí, una gran cantidad de recursos están ahí fuera y no son inteligentes para el cerebro y los recursos de calidad. He aquí algunos que me gustan:
SQLite y COntentProvider de Lars Vogel
Tutoriales Android del profesor Gustin

En cuanto al título de su pregunta Best practices for Android databases todo lo que puedo decir es que todas las mejores prácticas que se aplican a bases de datos SQL se aplican aquí como normalización, etc

Yo diría que la mejor práctica es usar un marco, que hará la mayor parte del trabajo para usted. Yo personalmente prefiero mapping ORM cuando se trabaja con bases de datos, por lo que recomendaría probar algún marco de ORM. El mejor que conozco es OrmLite . El autor también responde preguntas aquí en SO, que puede ser muy útil.

Pero si no quieres usarlo, deberías empezar leyendo estos artículos:

  • Guardar datos en bases de datos SQL
  • Uso de bases de datos
  • ¿Es posible acceder a la base de datos desde un servicio?
  • Cómo almacenar el objeto JSON en la base de datos SQLite
  • Volver a crear la base de datos al utilizar proveedores de contenido
  • Eliminar todas las filas de una tabla, lanza nullpointer
  • ¿Puede Universal loader de imágenes para Android trabajar con imágenes de sqlite db?
  • `RenamingDelegatingContext` está obsoleto. ¿Cómo probamos SQLite db ahora?
  • Android SQLite issue - table ... no tiene una columna llamada
  • Abrir y editar archivos PDF en la aplicación de Android con API
  • Búsqueda en varias columnas mediante búsqueda de texto completo (FTS) con varios tokens utilizando el operador OR
  • La aplicación se bloquea si el cursor SQLite no tiene resultados
  • ¿Cómo puedo obtener información sobre la columna causó restricción de clave externa en android sqlite?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.