SQLite
 sql >> Base de données >  >> RDS >> SQLite

Meilleures pratiques pour travailler avec plusieurs tables

J'ai réussi à créer une classe de base abstraite avec le nom de la base de données/instruction de création et d'autres informations partagées, puis à l'étendre pour chaque table. De cette façon, je peux garder toutes mes méthodes CRUD séparées (ce que je préfère de beaucoup). Le seul inconvénient est que la ou les instructions DATABASE_CREATE doivent résider dans la classe parent et doivent inclure toutes les tables, car de nouvelles tables ne peuvent pas être ajoutées par la suite, mais à mon avis, c'est un petit prix à payer pour conserver le CRUD méthodes pour chaque table séparément.

Faire cela était assez simple, mais voici quelques notes :

  • L'instruction create dans la classe parente doit être décomposé pour chaque table, car db.execSQL ne peut pas exécuter plus d'une instruction.
  • J'ai changé toutes les variables/méthodes privées en protégées, juste au cas où.
  • Si vous ajoutez des tables à une application existante (vous ne savez pas si cela est spécifique à l'émulateur), l'application doit être désinstallée puis réinstallée.

Voici le code de ma classe parent abstraite, basée sur le didacticiel du bloc-notes. Les enfants étendent simplement ceci, en appelant le constructeur du super (n'hésitez pas à l'utiliser) :

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();
    }

}

Une explication un peu plus détaillée est disponible ici :http://pheide.com/page/11/tab/24#post13