SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Práticas recomendadas para trabalhar com várias tabelas


Eu tive sucesso ao criar uma classe base abstrata com a instrução name/create do banco de dados e outras informações compartilhadas e, em seguida, estendê-la para todas as tabelas. Dessa forma, posso manter todos os meus métodos CRUD separados (o que eu prefiro). A única desvantagem é que a(s) instrução(ões) DATABASE_CREATE devem residir na classe pai e devem incluir todas as tabelas, porque novas tabelas não podem ser adicionadas posteriormente, mas na minha opinião esse é um pequeno preço a pagar para manter o CRUD métodos para cada tabela separadamente.

Fazer isso foi bastante simples, mas aqui estão algumas notas:
  • A instrução create na classe pai deve ser dividido para cada tabela, porque db.execSQL não pode executar mais de uma instrução.
  • Alterei todas as variáveis/métodos privados para protegidos, por precaução.
  • Se você estiver adicionando tabelas a um aplicativo existente (não tenho certeza se isso é específico do emulador), o aplicativo deverá ser desinstalado e reinstalado.

Aqui está o código para minha classe pai abstrata, que foi baseada no Tutorial do Bloco de Notas. Os filhos simplesmente estendem isso, chamando o construtor do super (sinta-se à vontade para usar isso):
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();
    }

}

Uma explicação um pouco mais detalhada está disponível aqui:http://pheide.com/page/11/tab/24#post13