SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Best Practices für das Arbeiten mit mehreren Tabellen

Ich hatte Erfolg beim Erstellen einer abstrakten Basisklasse mit dem Datenbanknamen/der Anweisung zum Erstellen und anderen gemeinsam genutzten Informationen und dann beim Erweitern für jede Tabelle. Auf diese Weise kann ich alle meine CRUD-Methoden getrennt halten (was ich sehr bevorzuge). Der einzige Nachteil ist, dass sich die DATABASE_CREATE-Anweisung(en) in der übergeordneten Klasse befinden und alle Tabellen enthalten müssen, da später keine neuen Tabellen hinzugefügt werden können, aber meiner Meinung nach ist dies ein geringer Preis, um die CRUD zu behalten Methoden für jede Tabelle getrennt.

Dies war ziemlich einfach, aber hier sind einige Hinweise:

  • Die create-Anweisung in der übergeordneten Klasse muss für jede Tabelle aufgeteilt werden, da db.execSQL nicht mehr als eine Anweisung ausführen kann.
  • Ich habe alle privaten Variablen/Methoden auf geschützt geändert, nur für den Fall.
  • Wenn Sie Tabellen zu einer bestehenden Anwendung hinzufügen (nicht sicher, ob dies emulatorspezifisch ist), muss die Anwendung deinstalliert und dann neu installiert werden.

Hier ist der Code für meine abstrakte übergeordnete Klasse, die auf dem Notepad-Tutorial basiert. Die Kinder erweitern dies einfach, indem sie den Konstruktor des Super aufrufen (Sie können dies gerne verwenden):

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

}

Eine etwas ausführlichere Erklärung finden Sie hier:http://pheide.com/page/11/tab/24#post13