Android SQLite – Nueva tabla VS. Nueva base de datos

Tengo un DB bastante completo en mi aplicación.

Cuando llegó el momento de agregar más funcionalidad, empecé a preguntarme si debía implementarla añadiendo más tablas a la base de datos existente, o abrir una base de datos totalmente nueva para la funcionalidad añadida y agregar las tablas allí.

¿Existen reglas básicas sobre cuándo abrir un nuevo DB? ¿Hay puntos de referencia disponibles sobre el tema?

One Solution collect form web for “Android SQLite – Nueva tabla VS. Nueva base de datos”

Cuando llegó el momento de agregar más funcionalidad, empecé a preguntarme si debía implementarla añadiendo más tablas a la base de datos existente, o abrir una base de datos totalmente nueva para la funcionalidad añadida y agregar las tablas allí.

¿Existen reglas básicas sobre cuándo abrir un nuevo DB? ¿Hay puntos de referencia disponibles sobre el tema?

Así que esta es una pregunta muy compleja y depende de más factores como el carácter de la aplicación, el rendimiento requerido, el carácter de las tablas, las relaciones entre ellos, etc.

Mucha gente, muchas opiniones para que todo el mundo pueda decirte algo diferente.

Pero mi opinión es que usted debe tener sólo una base de datos (también cuando tendrá bastante más tablas eq 10-20). A continuación, también tratar de pensar en un uso de Singleton .

Siempre es mejor tener todas las tablas en una base de datos especialmente en el caso de que esas tablas tienen algo en común (a veces es necesario unirse a dos o más tablas y si pones mesa (s) a otra base de datos este material se hará imposible). También no sabes (ahora mismo) si vas a actualizar tabla (s), cambiar las relaciones entre ellos etc. en un futuro (debido a la actualización de la aplicación por ejemplo). Por otro lado también la estructura de la aplicación es más limpia y legible como si tuviera por ejemplo cinco archivos *.db en el almacenamiento interno o externo (puedo decir que esto depende del tamaño de cada uno porque está enfermo para colocar el archivo .db de 100 MB a Almacenamiento interno).

Y en la pregunta sobre la implementación: Te recomiendo (como he mencionado anteriormente) para crear sólo un DatabaseHelper que se envuelva toda la lógica db necesario. A continuación, cree clases (una clase para una tabla) denominadas <?>Tools por ejemplo, <?>Tools de usuario, que envolverán operaciones CRUD y métodos específicos para una tabla específica. Estoy usando este enfoque y nunca tuve problemas.

Ejemplo de implementación:

He aquí un ejemplo de DatabaseHelper:

 package com.sajmon.examples.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DataSource extends SQLiteOpenHelper { private static DataSource instance = null; public static final String DB_NAME = "<dbname>"; public static final int DB_STARTING_VERSION = 1; public DataSource(Context cntx) { super(cntx, DB_NAME, null, DB_STARTING_VERSION); } /** * * @param mContext as Context of Activity * @return <li>new instance of }DataSource object.</li> */ public static DataSource getInstance(Context mContext) { if (instance == null) { instance = new DataSource(mContext); } return instance; } @Override public void onCreate(SQLiteDatabase db) { String query = "create table " + SQLConstants.TEST_TABLE_NAME + " (" + SQLConstants.KEY_ID + " integer not null, " + SQLConstants.KEY_TYPE + " text null, " + SQLConstants.KEY_DATE + " text null" + ")"; db.execSQL(query); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String query = "drop table if exists " + SQLConstants.TEST_TABLE_NAME; db.execSQL(query); onCreate(db); } } 

SQLConstants:

 package com.sajmon.examples.db; public class SQLConstants { public static final String TEST_TABLE_NAME = "Test"; public static final String KEY_ID = "id"; public static final String KEY_TYPE = "type"; public static final String KEY_DATE = "date"; } 

Ejemplo de TestTools:

 package com.sajmon.examples.db; import java.util.Date; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; public class TestTools { private Context mContext; private SQLiteDatabase db; public TestTools(Context mContext) { this.mContext = mContext; } public boolean insert(Test t) throws SQLException { try { db = openWrite(DataSource.getInstance(mContext)); ContentValues values = new ContentValues(); if (db != null) { db.beginTransaction(); values.put(SQLConstants.KEY_ID, t.getId()); values.put(SQLConstants.KEY_TYPE, t.getType()); values.put(SQLConstants.KEY_DATE, t.getDate()); db.insertOrThrow(SQLConstants.TEST_TABLE_NAME, SQLConstants.KEY_TYPE, values); values.clear(); db.setTransactionSuccessful(); return true; } return false; } finally { if (db != null) { db.endTransaction(); } close(db); } } public boolean update(Test t) { try { db = openWrite(DataSource.getInstance(mContext)); ContentValues values = new ContentValues(); int count = -1; if (db != null) { db.beginTransaction(); values.put(SQLConstants.KEY_TYPE, t.getType()); values.put(SQLConstants.KEY_DATE, t.getDate()); count = db.update(SQLConstants.TEST_TABLE_NAME, values, SQLConstants.KEY_ID + "= ?", new String[] {t.getId()}); db.setTransactionSuccessful(); } return count > 0; } finally { if (db != null) { db.endTransaction(); close(db); } } } public boolean delete(Test t) { int count = -1; try { db = openWrite(DataSource.getInstance(mContext)); if (db != null) { db.beginTransaction(); count = db.delete(SQLConstants.TEST_TABLE_NAME, SQLConstants.KEY_ID + "= ?", new String[] {t.getId()}); db.setTransactionSuccessful(); } return count > 0; } finally { if (db != null) db.endTransaction(); close(db); } } } public List<Test> getAll() { Cursor c = null; List<Test> tests = new ArrayList<Test>(); Test test = null; try { db = openRead(DataSource.getInstance(mContext)); if (db != null) { String[] columns = {SQLConstants.KEY_ID, SQLConstants.KEY_TYPE, SQLConstants.KEY_DATE}; c = db.query(SQLConstants.TEST_TABLE_NAME, columns, null, null, null, null, null); if (c.moveToFirst()) { do { test = new Test(); test.setId(c.getInt(c.getColumnIndex(SQLConstants.KEY_ID))); test.setType(c.getString(c.getColumnIndex(SQLConstants.KEY_TYPE))); test.setDate(c.getString(c.getColumnIndex(SQLConstants.KEY_DATE))); tests.add(test); } while(c.moveToNext()); } } return tests; } finally { if (c != null) { c.close(); } if (db != null) { close(db); } } } private final synchronized SQLiteDatabase openWrite(SQLiteOpenHelper handler) { return handler.getWritableDatabase(); } private final synchronized SQLiteDatabase openRead(SQLiteOpenHelper handler) { return handler.getReadableDatabase(); } private final synchronized void close(SQLiteDatabase db) { if (db != null && db.isOpen()) { db.close(); } } } 

Por lo tanto, un ejemplo básico de implementación que puede ser modificado / mejorado siempre que se basen en requisitos individuales. Y si desea hacer la implementación "en un nivel más abstracto", así DAOFactory patrón de diseño debe ser la mejor opción.

Nota: Es muy útil para ganar experiencia de otros desarrolladores de Android y luego empezar a pensar en ello y decidir el enfoque adecuado.

  • No se puede INSERTAR en SQLite, Código de error: 19
  • Podemos usar truncar consulta en android sqlite
  • Android SQLiteMisuseException al llamar a database.rawQuery
  • Restricción única del reino en varios campos
  • Actualización de versiones de base de datos sqlite?
  • Accede a la base de datos sqlite de Android desde el PC de desarrollo
  • Android: insertar varias filas en la base de datos sqlite no funciona
  • Hacer inserciones SQLite eficientes con Android
  • ¿El cursor SQLite de Android carga todos los registros en la memoria a la vez?
  • Android sqlite cómo comprobar si existe un registro
  • Sqlite no devuelve ninguna tabla, pero la tabla está presente cuando se obtiene en el dispositivo OnePlusTwo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.