Flutter

Cara untuk melakukan migration pada Sqflite

Sqflite adalah penyimpanan lokal berupa table yang sering digunakan pada project Flutter. Setiap pengembangan aplikasi, tak jarang kita memukan kondisi, di mana...

Ikhwan Written by Ikhwan · 1 min read >

Sqflite adalah penyimpanan lokal berupa table yang sering digunakan pada project Flutter. Setiap pengembangan aplikasi, tak jarang kita memukan kondisi, di mana kita harus menambahkan table baru pada sqflite atau mengubah column pada table yang sebelumnya telah digunakan. Pada kondisi tersebut dibutuhkan lah migration.

Tulisan ini termasuk ke pada rangkaian pembahasan penyimpanan data lokal pada Flutter:

  1. Penyimpanan data lokal pada Flutter (shared_preferences)
  2. Penyimpanan data lokal pada Flutter (sqflite)
  3. [Tulisan ini] Update schema pada Sqflite

Why?

Migration harus dilakukan. Karena jika tidak dilakukan akan terjadi error ketika device yang telah pernah menginstall aplikasi, melakukan pembaruan. Sedangkan error mungkin tidak akan terjadi untuk device yang baru pertama kali menginstall aplikasi.

Schema

Pada tulisan sebelumnya kita telah memiliki satu table, yaitu table mahasiswa. Kali ini kita akan menambahkan column baru pada table tersebut, dan juga membuat table baru. Berikut schemanya:

Schema

Yuk Ngoding

Pada tulisan sebelumnya, kita memiliki code pada MySqflite.dart seperti berikut:

class MySqflite {

  ...

  static final _databaseV1 = 1;
  static final tableMahasiswa = 'mahasiswa';

  static final columnNim = 'nim';
  static final columnName = 'name';
  static final columnDepartment = 'department';
  static final columnSKS = 'sks';

  ...

  _initDatabase() async {
    var databasesPath = await getDatabasesPath();
    String path = join(databasesPath, _databaseName);

    return await openDatabase(path, version: _databaseV1,
        onCreate: (db, version) async {
      var batch = db.batch();
      _onCreateTableMahasiswa(batch);

      await batch.commit();
    });
  }

  void _onCreateTableMahasiswa(Batch batch) async {
    batch.execute('''
          CREATE TABLE $tableMahasiswa (
            $columnNim TEXT PRIMARY KEY,
            $columnName TEXT,
            $columnDepartment TEXT,
            $columnSKS INTEGER
          )
          ''');
  }
  
  ...

}

Perbarui bagian tersebut menjadi seperti berikut:

class MySqflite {

  ...

  static final _databaseV1 = 1;
  static final _databaseV2 = 2;

  ///MAHASISWA
  static final tableMahasiswa = 'mahasiswa';

  static final columnNim = 'nim';
  static final columnName = 'name';
  static final columnDepartment = 'department';
  static final columnSKS = 'sks';
  static final columnAddress = 'alamat'; //new column

  ///ORGANISASI
  static final tableOrganisasi = 'organisasi';

  static final columnId = 'idOrganisasi';
  static final columnOrganisasiNim = 'nim';
  static final columnOrganisasiName = 'name';

  ...

  _initDatabase() async {
    var databasesPath = await getDatabasesPath();
    String path = join(databasesPath, _databaseName);

    return await openDatabase(path, version: _databaseV2,
        onCreate: (db, version) async {
      var batch = db.batch();
      _onCreateTableMahasiswaV2(batch);
      _onCreateTableOrganisasiV2(batch);
      await batch.commit();
    }, onUpgrade: (db, oldVersion, newVersion) async {
      var batch = db.batch();
      if (oldVersion == _databaseV1) {
        _onUpdateTableMahasiswaV1toV2(batch);
        _onCreateTableOrganisasiV2(batch);
      }
      await batch.commit();
    });
  }

  void _onCreateTableMahasiswaV2(Batch batch) async {
    batch.execute('''
          CREATE TABLE $tableMahasiswa (
            $columnNim TEXT PRIMARY KEY,
            $columnName TEXT,
            $columnDepartment TEXT,
            $columnSKS INTEGER,
            $columnAddress TEXT
          )
          ''');
  }

  void _onUpdateTableMahasiswaV1toV2(Batch batch) async {
    batch.execute("ALTER TABLE $tableMahasiswa ADD COLUMN $columnAddress TEXT");
  }

  void _onCreateTableOrganisasiV2(Batch batch) async {
    batch.execute('''
          CREATE TABLE $tableOrganisasi (
            $columnId INTEGER PRIMARY KEY AUTOINCREMENT,
            $columnOrganisasiNim TEXT,
            $columnOrganisasiName TEXT
          )
          ''');
  }

  ...

}
  • Pada function _initDatabase() kita menaikkan versi database menjadi _databaseV2.
  • Pada bagian onCreate database, kita menjalankan function untuk membuat 2 table sesuai dengan schema baru yang kita miliki
  • Sedangkan untuk onUpgrade kita melakukan pengecekan versi, melakukan alter untuk perubahan schema pada table mahasiswa, dan membuat table baru untuk table organisasi.
  • Setelah melakukan onUpgrade (migration), kita bisa mengoperasikan database, seperti menambah data, mengambil data, tanpa menemukan error terkait version atau schema yang kita gunakan.

Hasil

Code dari case pada tulisan ini bisa dilihat pada link Gist.Github.

Berikut merupakan hasil dari memasukkan data sebelum migration dilakukan, dan memasukkan data setelah migration dilakukan.

Hasil

Sekian tulisan kali ini, terimakasih dan semoga bermanfaat ya 😀

Oh iya di website ini ada tulisan menarik lainnya juga loh, seperti berikut:

Cara untuk Migrasi ke Flutter 2

Ikhwan in Flutter
  ·   2 min read

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *