studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android database model-view-controller sqlite datamodel

para - manual de programacion android pdf



Crear clase de modelo de datos para el manejo de la base de datos (3)

Estaba empezando a trabajar en una aplicación de base de datos cuando me di cuenta de que debería implementar un patrón MVC ya que la aplicación es bastante compleja e implica varias operaciones de base de datos.
Con respecto a esto, he decidido crear una model class separada para manejar las operaciones de la base de datos. Esta clase tendrá todos los métodos que me devolverán los datos después de ejecutar el comando Sqlite (Seleccionar por ejemplo) O simplemente ejecutará el comando SQLite (Eliminar por ejemplo). Pero lo que quiero es separar esta clase de la clase de Database Adapter de Database Adapter , donde abro, creo y cierro mi base de datos.
Déjame poner mi concepto en código:

public class DataModel { /* Private members */ // Method to Select data from Student table public ArrayList<String> FetchStudents (parameter 1) { private ArrayList<String> arrStudent; DatabaseAdapter objDB= new DatabaseAdapter(); objDB.open(); /* Some code */ objDB.close(); return arrStudent } //Method to delete record from Student table public DeleteStudent(parameter 1) { DatabaseAdapter objDB= new DatabaseAdapter(); objDB.open(); //Some code objDB.close(); } /* Rest of methods */ }

// DatabaseAdapterClass

private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } /** * onCreate method is called for the 1st time when database doesn''t exists. */ @Override public void onCreate(SQLiteDatabase db) { Log.i(TAG, "Creating DataBase: " + CREATE_STUDENT_TABLE); db.execSQL(CREATE_STUDENT_TABLE); } /** * onUpgrade method is called when database version changes. */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion); } }

Pregunta :
Lo que quiero preguntar es ¿este es el enfoque correcto de implementación? ¿Está bien si creamos una clase separada para los métodos de la base de datos ? ¿Qué limitaciones o problemas creen ustedes que podrían molestarme más adelante? Además, ¿hay una mejor manera de implementar el concepto anterior?

Gracias
Piedra


El modelado de datos de enfoque nativo de android es de proveedores de contenido. Enlazar

de alguna manera, abstrae el tipo de fuente de datos.

solía hacerlo de una manera similar. pero nuevamente también es subjetivo.


A lo que se refiere como una ''clase de modelo'' se le conoce más comúnmente como un objeto de acceso a datos (DAO). Su modelo generalmente sería un conjunto de clases que contienen sus datos y lógica comercial. En tu caso, probablemente una clase de Student tenga una ID, un nombre, un GPA, etc. Si desea separar el acceso a los datos de su modelo, su clase de acceso a los datos ( DatabaseHelper ) consultará la base de datos y usará los datos que obtenga para devolver Student objetos del Student o una List<Student> . Realmente no tiene mucho sentido separar la clase de acceso a datos del asistente de base de datos, es mejor tener todo su código relacionado con la base de datos en un solo lugar.

Sin embargo, el uso de clases de modelo (sin embargo) puede no ser siempre práctico en Android, ya que cuenta con soporte nativo para obtener y mostrar datos de un Cursor ( CursorAdapter , etc.). Si quiere usar algo de eso, debería exponer sus datos no como objetos modelo sino como Cursor . En cuanto a los proveedores de contenido, eche un vistazo a esos también, pero si no necesita exponer sus datos a otras aplicaciones, escribir un ContentProvider puede ser excesivo.

En otra nota, no desea abrir y cerrar la base de datos en cada consulta. De hecho, es seguro dejarlo abierto, se cerrará automáticamente cuando muera el proceso de tu aplicación.


Hago esto en mi aplicación y funciona de maravilla, el código está limpio y no afecta el rendimiento en absoluto, especialmente con los teléfonos de hardware que tienen hoy en día. Probé todos los otros enfoques e incluso utilicé un proveedor de contenido, pero en mi opinión eso simplemente complicaba las cosas.