sqflite 패키지 사용법
Author: Young
2022-08-12
sqflite 패키지 설치
<img src=../../assets/img/sqflite.png style=”width:700px”>
최신 버전 : 2.0.3+1 (2022-08-10 기준)
path 패키지 설치
내부 데이터베이스의 위치를 정확히 정의해 주는 패키지.
<img src=../../assets/img/path.png style=”width:700px”>
최신 버전 : 1.8.2 그러나 호환을 위해 1.8.1로 설치
pub get
당연하게도 pub get을 해준다.
sqflite: ^2.0.3+1
path: ^1.8.1
소스먼저
DogHelper class 를 만들거야 (Create Table)
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
class DogHelper{
Future start() async { // start 함수 사용하면 디비랑 테이블을 만들어줌.
final databasePath = await getDatabasesPath();
String path = join(databasePath, 'doggie_database.db');
final database = await openDatabase(
path,
version: 1,
onCreate: (db, version) {
return db.execute( // Create
"CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)",
);
}
);
Insert 하기
Future<void> insertDog(Dog dog) async {
// 데이터베이스 reference를 얻습니다.
final Database db = await database;
// Dog를 올바른 테이블에 추가하세요. 또한
// `conflictAlgorithm`을 명시할 것입니다. 본 예제에서는
// 만약 동일한 dog가 여러번 추가되면, 이전 데이터를 덮어쓸 것입니다.
await db.insert(
'dogs',
dog.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Update 하기
Future<void> updateDog(Dog dog) async {
// 데이터베이스 reference를 얻습니다.
final db = await database;
// 주어진 Dog를 수정합니다.
await db.update(
'dogs',
dog.toMap(),
// Dog의 id가 일치하는 지 확인합니다.
where: "id = ?",
// Dog의 id를 whereArg로 넘겨 SQL injection을 방지합니다.
whereArgs: [dog.id],
);
}
Delete 하기
Future<void> deleteDog(int id) async {
// 데이터베이스 reference를 얻습니다.
final db = await database;
// 데이터베이스에서 Dog를 삭제합니다.
await db.delete(
'dogs',
// 특정 dog를 제거하기 위해 `where` 절을 사용하세요
where: "id = ?",
// Dog의 id를 where의 인자로 넘겨 SQL injection을 방지합니다.
whereArgs: [id],
);
}
Select 하기
Future<List<Dog>> dogs() async {
// 데이터베이스 reference를 얻습니다.
final Database db = await database;
// 모든 Dog를 얻기 위해 테이블에 질의합니다.
final List<Map<String, dynamic>> maps = await db.query('dogs');
// List<Map<String, dynamic>를 List<Dog>으로 변환합니다.
return List.generate(maps.length, (i) {
return Dog(
id: maps[i]['id'],
name: maps[i]['name'],
age: maps[i]['age'],
);
});
}
Dog class 만들기
class Dog {
final int id;
final String name;
final int age;
Dog({required this.id,required this.name,required this.age});
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'age': age,
};
}
// 각 dog 정보를 보기 쉽도록 print 문을 사용하여 toString을 구현하세요
@override
String toString() {
return 'Dog{id: $id, name: $name, age: $age}';
}
}
Dog Instance 만들고 사용
var fido = Dog(id: 0,name: 'Fido',age: 35,);
// 데이터베이스에 dog를 추가합니다.
await insertDog(fido);
// dog 목록을 출력합니다. (지금은 Fido만 존재합니다.)
print(await dogs());
// Fido의 나이를 수정한 뒤 데이터베이스에 저장합니다.
fido = Dog(id: fido.id,name: fido.name,age: fido.age + 7,);
await updateDog(fido);
// Fido의 수정된 정보를 출력합니다.
print(await dogs());
// Fido를 데이터베이스에서 제거합니다.
// await deleteDog(fido.id);
// dog 목록을 출력합니다. (비어있습니다.)
print(await dogs());
// 결과
//I/flutter (18925): [Dog{id: 0, name: Fido, age: 35}]
//I/flutter (18925): [Dog{id: 0, name: Fido, age: 42}]
//I/flutter (18925): [Dog{id: 0, name: Fido, age: 42}]
데이터베이스 inspector 사용하는 방법 -1
View > Tool Windows > App Inspection 선택

참고
- sqflite 패키지는 웹에서는 사용할 수 없다.
- App Inspection 안에 들어가야 볼 수 있다.
데이터베이스 inspector 사용하는 방법 -2
App Inspection 클릭 시

Query 도 사용할 수 있음

추가 관련 사항
진행하면서 간과한 사항이 있었다.
앱 Inspection 에서만 SQL을 사용할 수 있는데(웹에선 x)
우리 backend는 회사에서 host 타고 웹으로만 접속할 수 있음.
앱 vm으로는 host를 읽지 못하므로 backend 데이터를 가져올 수 없음