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.
- Método SQLiteDatabase.query
- Recuperar un nombre de usuario y una contraseña en SQLITE DB por EMAIL_ADDRESS en ANDROID
- Varios Table SQLite DB Adapter (s) en Android?
- Mejor alternativa de la librería Android de SQLite?
- No se puede copiar la base de datos SQLite de los activos
- Android SQLite - selecciónArgs que no sean cadenas
- ¿Debo usar un proveedor de contenido?
- Close () nunca fue explícitamente llamado en Android y SQlite
- Android sqlite CREATE TABLE SI NO EXISTE
- Vista de lista con la opción de actualización y supresión mediante contextmenu
- ¿Por qué mi Android SQLite DB ha corrompido de repente?
- No se puede degradar la base de datos de la versión 2 a 1 incluso después de una nueva instalación y volver a ejecutar
- AUTOINCREMENT sólo está permitido en un INTEGER PRIMARY KEY - android
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.
SQLite sería la respuesta.
Enlace: http://developer.android.com/reference/android/database/sqlite/package-summary.html
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
- Enlaces clicables y menú de copiar / pegar en EditView en android
- Error al intentar ejecutar una aplicación Cordova en un dispositivo Android