SQLite
 sql >> Database >  >> RDS >> SQLite

Procedure consigliate per lavorare con più tabelle

Ho avuto successo con la creazione di una classe base astratta con il nome del database/istruzione create e altre informazioni condivise e quindi estendendola per ogni tabella. In questo modo, posso tenere separati tutti i miei metodi CRUD (cosa che preferisco di gran lunga). L'unico aspetto negativo è che le istruzioni DATABASE_CREATE devono risiedere nella classe genitore e devono includere tutte le tabelle, perché non è possibile aggiungere nuove tabelle in seguito, ma secondo me è un piccolo prezzo da pagare per mantenere il CRUD metodi per ogni tabella separati.

Farlo è stato abbastanza semplice, ma ecco alcune note:

  • L'istruzione create nella classe genitore deve essere suddiviso per ogni tabella, perché db.execSQL non può eseguire più di un'istruzione.
  • Ho cambiato tutte le var/metodi private in protetto, per ogni evenienza.
  • Se stai aggiungendo tabelle a un'applicazione esistente (non sono sicuro che sia specifica per l'emulatore), l'applicazione deve essere disinstallata e quindi reinstallata.

Ecco il codice per la mia classe genitore astratta, che era basata sul Tutorial Blocco note. I bambini semplicemente estendono questo, chiamando il costruttore del super (sentiti libero di usarlo):

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 spiegazione leggermente più dettagliata è disponibile qui:http://pheide.com/page/11/tab/24#post13