본문 바로가기

APP/Flutter

[플러터] SQLite DB 내용 수정 - Flutter, onUpgrade, sqflite, 데이터베이스, db, database

반응형

  다음 링크에서 기본적인 SQLite 사용법이 정리되어있다.

2021.12.13 - 플러터 SQLite 기본 사용법 - CRUD, sqflite, Flutter, 패키지

 

플러터 SQLite 기본 사용법 - CRUD, sqflite, Flutter, 패키지

서버와 통신해서 DB에 데이터를 저장하고 가져올 수도 있지만 앱 내부 DB를 이용하는게 프로젝트 진행에 더 유리한 경우가 있다. 그런 경우에 내부 DB(SQLite DB)에 쉽게 접근하기 위해 사용하는 패

zzangwoo.tistory.com


  이미 배포된 앱의 DB 내용을 바꿔야 하는 경우 처음 Database 객체를 가져올 때 onUpgrade 속성을 이용하여 바꿔줄 수 있다.

 

기존 Database

코드

class SqliteTestModel {
  Database? _database;
  
  Future<Database> get database async {
    if (_database != null) return _database!;

    return await initDB();
  }
  
  initDB() async {
    String path = join(await getDatabasesPath(), 'test_database.db');
    
    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
      onUpgrade: _onUpgrade
    );
  }

	FutureOr<void> _onCreate(Database db, int version) {
    String sql = '''
    CREATE TABLE testTable(
      No INTEGER PRIMARY KEY AUTOINCREMENT,
      UserID TEXT,
      Content TEXT,
      RecordDate DATETIME)
    ''';

    db.execute(sql);
  }

  FutureOr<void> _onUpgrade(Database db, int oldVersion, int newVersion) {}

	... 생략 ...
	
}
  • DB에 접근하기 위해서 database 프로퍼티를 호출하게되면 openDatabase 메서드를 통해서 DB 버전 비교 후에 Database 객체를 생성해준다.

 

기존 Database

 

Database Update

  기존에 만들어 놓은 테이블에 'NewColumn' 이라는 컬럼을 추가해보려한다.

코드

class SqliteTestModel {
  Database? _database;
  
  Future<Database> get database async {
    if (_database != null) return _database!;

    return await initDB();
  }
  
  initDB() async {
    String path = join(await getDatabasesPath(), 'test_database.db');
    
    return await openDatabase(
      path,
      version: 2,
      onCreate: _onCreate,
      onUpgrade: _onUpgrade
    );
  }

	FutureOr<void> _onCreate(Database db, int version) {
    String sql = '''
    CREATE TABLE testTable(
      No INTEGER PRIMARY KEY AUTOINCREMENT,
      UserID TEXT,
      Content TEXT,
      RecordDate DATETIME,
      NewColumn TEXT)
    ''';

    db.execute(sql);
  }

  FutureOr<void> _onUpgrade(Database db, int oldVersion, int newVersion) {
    if (oldVersion < newVersion) {
      db.execute('ALTER TABLE testTable ADD COLUMN NewColumn TEXT');
    }
  }

	... 생략 ...

}
  • openDatabase 메서드를 호출할 때 DB 변경이 있음을 알려주기 위해 version을 1에서 2로 변경해주었다.
  • DB가 수정된 버전의 앱을 새로 받는 사용자를 위해 _onCreate 메서드에도 'NewColumn' 컬럼을 추가해서 테이블을 생성하도록 하였다.
  • _onUpgrade 메서드에는 DB 변경내용 ('NewColumn' 컬럼 추가)을 적용해주었다.

 

결과

반응형