반응형
플러터 로컬디비 서치해보면 나름 이것저것 있는데, 그중 Hive라고 NoSQL 기반 라이브러리도 있더라.
한 번 써보고 싶다고 생각했는데, 이 프로젝트는 일단 관계형DB가 더 나을 것 같아서 저건 나중에 기회 되면 또 사용해보는 걸로.
1. 패키지 설치
flutter pub add sqflite
그리고 해보니까 path 패키지도 필요하더라
flutter pub add path
2. 코드 작성
2-a. Database 만들기
Future<Database> getDatabase() async {
if (_database != null) return _database!;
final String dbPath = await getDatabasesPath();
final String path = join(dbPath, _dbFileName);
_database = await openDatabase(
path,
version: 1,
onCreate: (db, version) {
return db.execute(
'''
CREATE TABLE ${ToDoTable.tableName}(
${ToDoTable.columnId} INTEGER PRIMARY KEY AUTOINCREMENT,
${ToDoTable.columnTitle} TEXT NOT NULL,
${ToDoTable.columnColor} INTEGER,
${ToDoTable.columnDoneDate} TEXT,
${ToDoTable.columnCreatedAt} TEXT NOT NULL
)
''',
);
},
);
return _database!;
}
_dbFileName 자리에는 원하는 db 파일 이름을 넣어주면 된다. (ex. ```"app_database.db"```)
openDatabase 할 때는 db 파일이 존재하면 해당 파일을 열어주고, 아니라면 새로 생성해서 연다.
- Table 이름이나 Column 이름은 상수 값으로 따로 빼뒀다.
- id 값은 정수 타입으로 자동 증가하게 구현해뒀다.
- datetime 타입은 따로 존재하지 않아서 TEXT 타입으로 생성해야 한다고 한다.
2-b. 데이터 삽입 & 전체 데이터 조회
제일 빠른 로그 출력을 위해서 삽입 및 조회부터 호다닥 작성해봤다.
Future<List<Map<String, Object?>>> getAllItems() async {
final db = await AppDatabase().getDatabase();
return await db.query(ToDoTable.tableName);
}
Future<int> insertItem(Map<String, dynamic> item) async {
final db = await AppDatabase().getDatabase();
return await db.insert(ToDoTable.tableName, item);
}
await dao.insertItem({
ToDoTable.columnTitle: "Test Title",
ToDoTable.columnCreatedAt: DateTime.now().toString(),
});
final result = await dao.getAllItems();
debugPrint("$result");
flutter: [{id: 1, title: Test Title, color: null, done_date: null, created_at: 2024-11-23 17:26:56.167249}]
flutter: [{id: 1, title: Test Title, color: null, done_date: null, created_at: 2024-11-23 17:26:56.167249}, {id: 2, title: Test Title, color: null, done_date: null, created_at: 2024-11-23 17:27:03.078625}]
2-c. 데이터 업데이트 및 삭제
그래도 업데이트랑 삭제 안 해주면 서운하니 작성해보자
Future<int> updateItem(int id, String title) async {
final db = await AppDatabase().getDatabase();
return await db.update(ToDoTable.tableName,
{
ToDoTable.columnTitle: title,
},
where: "id = ?",
whereArgs: [id],
);
}
Future<int> deleteItem(int id) async {
final db = await AppDatabase().getDatabase();
return await db.delete(
ToDoTable.tableName,
where: "id = ?",
whereArgs: [id],
);
}
/// 업데이트
await dao.updateItem(1, "new Title");
var result = await dao.getAllItems();
debugPrint("$result");
/// 삭제
await dao.deleteItem(1);
result = await dao.getAllItems();
debugPrint("$result");
flutter: [{id: 1, title: new Title, color: null, done_date: null, created_at: 2024-11-23 17:26:56.167249}, {id: 2, title: Test Title, color: null, done_date: null, created_at: 2024-11-23 17:27:03.078625}]
flutter: [{id: 2, title: Test Title, color: null, done_date: null, created_at: 2024-11-23 17:27:03.078625}]
DB 파일 생성했고, 테이블도 만들었고, 데이터 매만진 뒤에 조회하는 것도 확인했으니 이제 모델 만들고 아키텍처에 맞게 repository 만들기 등 알아서 진행해주면 된다.
🔗 [ Flutter / 플러터 ] SQFlite 문서 정리 및 예제로 마스터해보자.
위 링크에는 버전 관리, 트랜젝션 등등 좀더 자세한 기능과 테스트 코드들도 보여주고 있어서 공부할 때 도움 될 것 같다.
* DAO: Data Access Object
<도움 받은 링크들>
728x90
반응형
'개발노트 > Flutter' 카테고리의 다른 글
MVVM Clean Architecture (+Provider) (2) | 2024.11.26 |
---|---|
Flutter에서 Firebase Authentication으로 이메일 로그인 구현하기 (0) | 2024.11.24 |
Flutter에서 FCM 설정하기 (0) | 2024.11.21 |
Flutter 프로젝트에서 Apple Login 설정하기 (1) | 2024.11.17 |
Flutter 프로젝트에서 Google Login 설정하기 (2) | 2024.11.16 |