반응형
flutter에서 데이터를 로컬에 저장하는 방법은 두가지가 있다.
하나는 shared preference이고 다른 하나는 sqflite이다.
shared preference의 경우에는, 자동 로그인 같은 간단한 데이터를 저장하고 싶을 때 사용한다.
sqflite는 디바이스에 많은 데이터를 저장 하고, 쿼리를 요청할 때 사용한다.
먼저, puspec.yaml 파일에 dependency를 추가해준다.
dependencies:
sqflite:
1. 데이터베이스 열기
Future<Database> get database async {
if (_db != null) return _db;
_db = openDatabase(join(await getDatabasesPath(), 'Record5.db'),
onCreate: (db, version) => _createDb(db), version: 1);
return _db;
}
static void _createDb(Database db) {
db.execute(
"CREATE TABLE Record(date DATETIME PRIMARY KEY, silence BOOL, promise BOOL, visu BOOL, excercise BOOL, reading BOOL, recording BOOL)",
);
}
opendatabase : getDatabasesPath()의 경로에서 Record5.db라는 파일을 생성하고 데이터베이스를 연다.
onCreate : 데이터베이스에서 CREATE TABLE이다. (테이블 생성), 버전을 설정할수도 있다.
2. DB에 데이터 추가
Future<void> insertRecord(Record record) async {
final db = await database;
await db.insert("Record", record.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace);
}
await를 이용해서 데이터베이스 reference를 얻고,
해당 데이터가 두번 추가되는 경우를 막기 위해서 conflictalgorithm을 사용한다.
conflictalgorithm.replace를 사용하면 이전 데이터를 갱신한다.
3. 전체 데이터 가져오기
Future<List<Record>> getAllRecord() async {
final db = await database;
final List<Map<String, dynamic>> maps = await db.query('Record');
return List.generate(maps.length, (i) {
return Record(
date: maps[i]['date'],
silence: maps[i]['silence'],
promise: maps[i]['promise'],
visu: maps[i]['visu'],
excercise: maps[i]['excercise'],
reading: maps[i]['reading'],
recording: maps[i]['recording']);
});
}
모든 데이터 리스트를 가져올 수 있다.
그리고, List<Map<String,dynamic>을 List<item>으로 변환해야한다. (여기서 item은 Record)
4. 특정 데이터 가져오기
Future<dynamic> getRecord(DateTime date) async {
final db = await database;
final List<Map<String, dynamic>> maps = (await db.query(
'Record',
where: 'date = ?',
whereArgs: [date],
));
return maps.isNotEmpty ? maps : null;
}
db에 존재하는 특정 데이터를 가져올 수 있다. 여기서는 date column에 있는 특정 데이터를 가져왔다.
5. 데이터 삭제
Future<void> deleteRecord(DateTime date) async {
final db = await database;
await db.delete(
"Record",
where: "record = ?",
whereArgs: [date],
);
}
Record 데이터를 삭제한다.
다음은 전체 코드이다.
class DBHelper {
var _db;
var _dbname = 'Record5.db';
Future<Database> get database async {
if (_db != null) return _db;
_db = openDatabase(join(await getDatabasesPath(), 'Record5.db'),
onCreate: (db, version) => _createDb(db), version: 1);
return _db;
}
static void _createDb(Database db) {
db.execute(
"CREATE TABLE Record(date DATETIME PRIMARY KEY, silence BOOL, promise BOOL, visu BOOL, excercise BOOL, reading BOOL, recording BOOL)",
);
}
Future<void> insertRecord(Record record) async {
final db = await database;
await db.insert("Record", record.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace);
}
Future<List<Record>> getAllRecord() async {
final db = await database;
final List<Map<String, dynamic>> maps = await db.query('Record');
return List.generate(maps.length, (i) {
return Record(
date: maps[i]['date'],
silence: maps[i]['silence'],
promise: maps[i]['promise'],
visu: maps[i]['visu'],
excercise: maps[i]['excercise'],
reading: maps[i]['reading'],
recording: maps[i]['recording']);
});
}
Future<dynamic> getRecord(DateTime date) async {
final db = await database;
final List<Map<String, dynamic>> maps = (await db.query(
'Record',
where: 'date = ?',
whereArgs: [date],
));
return maps.isNotEmpty ? maps : null;
}
Future<void> updateRecord(Record record) async {
final db = await database;
await db.update(
"Record",
record.toMap(),
where: "date = ?",
whereArgs: [record.date],
);
}
Future<void> deleteRecord(DateTime date) async {
final db = await database;
await db.delete(
"Record",
where: "record = ?",
whereArgs: [date],
);
}
}
반응형