sql >> Base de Datos >  >> RDS >> SQLite

Prácticas recomendadas para trabajar con varias tablas

Tuve éxito al crear una clase base abstracta con el nombre de la base de datos/crear declaración y otra información compartida, y luego extenderla para cada tabla. De esta manera, puedo mantener todos mis métodos CRUD separados (lo que prefiero). El único inconveniente es que las declaraciones DATABASE_CREATE deben residir en la clase principal y deben incluir todas las tablas, porque no se pueden agregar nuevas tablas después, pero en mi opinión es un pequeño precio a pagar para mantener el CRUD. métodos para cada tabla por separado.

Hacer esto fue bastante simple, pero aquí hay algunas notas:

  • La declaración de creación en la clase principal debe dividirse para cada tabla, porque db.execSQL no puede ejecutar más de una instrucción.
  • Cambié todas las variables/métodos privados a protegidos, por si acaso.
  • Si está agregando tablas a una aplicación existente (no estoy seguro si esto es específico del emulador), la aplicación debe desinstalarse y luego reinstalarse.

Aquí está el código para mi clase principal abstracta, que se basó en el Tutorial del Bloc de notas. Los niños simplemente amplían esto, llamando al constructor del super (siéntete libre de usar esto):

package com.pheide.trainose;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public abstract class AbstractDbAdapter {

    protected static final String TAG = "TrainOseDbAdapter";
    protected DatabaseHelper mDbHelper;
    protected SQLiteDatabase mDb;

    protected static final String TABLE_CREATE_ROUTES =
        "create table routes (_id integer primary key autoincrement, "
        + "source text not null, destination text not null);";
    protected static final String TABLE_CREATE_TIMETABLES =    
        "create table timetables (_id integer primary key autoincrement, "
        + "route_id integer, depart text not null, arrive text not null, "
        + "train text not null);";

    protected static final String DATABASE_NAME = "data";
    protected static final int DATABASE_VERSION = 2;

    protected final Context mCtx;

    protected static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(TABLE_CREATE_ROUTES);
            db.execSQL(TABLE_CREATE_TIMETABLES);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS routes");
            onCreate(db);
        }
    }

    public AbstractDbAdapter(Context ctx) {
        this.mCtx = ctx;
    }

    public AbstractDbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }

}

Una explicación un poco más detallada está disponible aquí:http://pheide.com/page/11/tab/24#post13