SQLite
 sql >> база данни >  >> RDS >> SQLite

Най-добри практики за работа с множество таблици

Успях да създам абстрактен базов клас с изявлението име/създаване на базата данни и друга споделена информация и след това да го разширя за всяка таблица. По този начин мога да запазя всичките си CRUD методи отделно (което много предпочитам). Единственият недостатък е, че изразът(ите) DATABASE_CREATE трябва да се намират в родителския клас и трябва да включва всички таблици, тъй като нови таблици не могат да се добавят след това, но според мен това е малка цена, за да се запази CRUD методи за всяка таблица отделно.

Правенето на това беше сравнително лесно, но ето някои бележки:

  • Изразът create в родителския клас трябва да бъде разбит за всяка таблица, тъй като db.execSQL не може да изпълни повече от един израз.
  • Промених всички частни варове/методи на защитени, за всеки случай.
  • Ако добавяте таблици към съществуващо приложение (не съм сигурен дали това е специфично за емулатора), приложението трябва да бъде деинсталирано и след това преинсталирано.

Ето кода за моя абстрактен родителски клас, който беше базиран на урока за Notepad. Децата просто разширяват това, извиквайки конструктора на супер (можете да използвате това):

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

}

Малко по-подробно обяснение е достъпно тук:http://pheide.com/page/11/tab/24#post13



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да форматирате дата и час в SQLite

  2. Не мога да задам няколко изображения в изглед на мрежа?

  3. Урок за удостоверяване с биометрични USB пръстови отпечатъци за android

  4. Редът за актуализация на Android SQLite не работи

  5. WinDeath при notifyDataSetChanged()