[Flutter] 메모 6
2020. 12. 27. 21:30ㆍFlutter Mobile App/Flutter 메모 앱
반응형
SHA512 해시 활용 메모 ID 생성
메모 ID 값은 다른 메모와 중복이 되면 안되므로 고유한 값을 가져야하며, 매번 고유한 ID 값으로 변경하기 번거로우니, 고유한 값을 부여하기 위해 해시를 사용한다.
또한 해시는 단방향 암호화를 하니 안전하다.
crypto 플러그인 추가
작성 페이지
screens/write_page.dart
더보기
import 'package:flutter/material.dart';
import 'package:memo/model/memo.dart';
import 'package:memo/repository/db_helper.dart';
import 'package:crypto/crypto.dart';
import 'dart:convert';
// ignore: must_be_immutable
class WritePage extends StatelessWidget {
String title = '';
String text = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
IconButton(
icon: const Icon(Icons.delete),
onPressed: () {
print('삭제 아이콘 클릭');
},
),
IconButton(
icon: const Icon(Icons.save),
onPressed: () {
print('저장 아이콘 클릭');
saveDB();
},
)
],
),
body: Padding(
padding: EdgeInsets.all(20),
child: Column(
children: [
TextField(
onChanged: (String title) {
this.title = title;
},
style: TextStyle(fontSize: 30, fontWeight: FontWeight.w500),
keyboardType: TextInputType.multiline,
maxLines: null,
decoration: InputDecoration(hintText: '메모 제목을 입력하세요.'),
),
Padding(
padding: EdgeInsets.all(10),
),
TextField(
onChanged: (String text) {
this.text = text;
},
keyboardType: TextInputType.multiline,
maxLines: null,
decoration: InputDecoration(hintText: '메모 내용을 입력하세요.'),
),
],
),
),
);
}
Future<void> saveDB() async {
DBHelper dbHelper = DBHelper();
var memo = Memo(
id: convertStr2Sha512(DateTime.now().toString()),
title: this.title,
text: this.text,
createdTime: DateTime.now().toString(),
editedTime: DateTime.now().toString(),
);
print('저장하기 시도 ${memo.toString()}');
await dbHelper.insertMemo(memo);
print('저장하기');
print(await dbHelper.selectMemos());
}
String convertStr2Sha512(String text) {
var bytes = utf8.encode(text);
var digest = sha512.convert(bytes);
print('Sha512 암호화 $text');
print(digest);
return digest.toString();
}
}
메모
model/memo.dart
더보기
class Memo {
final String id;
final String title;
final String text;
final String createdTime;
final String editedTime;
Memo({this.id, this.title, this.text, this.createdTime, this.editedTime});
Map<String, dynamic> toMap() {
return {
'id': id,
'title': title,
'text': text,
'createdTime': createdTime,
'editedTime': editedTime
};
}
@override
String toString() {
// TODO: implement toString
return """
Memo {
id: $id,
title: $title,
text: $text,
createdTime: $createdTime,
editedTime: $editedTime
}
""";
}
}
DB 메모 작성 및 수정
repository/db_helper.dart
더보기
import 'package:memo/model/memo.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
final String tableName = 'memos';
class DBHelper {
var _db;
// DB 조회
Future<Database> get database async {
if (_db != null) return _db;
_db = openDatabase(
// DB 경로 지정 : path 패키지의 join 함수 사용
join(await getDatabasesPath(), 'memos.db'),
onCreate: (db, version) {
return db.execute(
"""
CREATE TABLE memos(
id TEXT PRIMARY KEY,
title TEXT,
text TEXT,
createdTime TEXT,
editedTime TEXT
)
""",
);
},
// DB 업그레이드 / 다운그레이드를 수행하기 위한 경로 제공
version: 1,
);
return _db;
}
// 메모 등록
Future<void> insertMemo(Memo memo) async {
final db = await database;
print(memo.toMap());
await db.insert(
tableName,
memo.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
print('완료');
}
// 메모 리스트
Future<List<Memo>> selectMemos() async {
final db = await database;
final List<Map<String, dynamic>> maps = await db.query('memos');
return List.generate(maps.length, (i) {
return Memo(
id: maps[i]['id'],
title: maps[i]['title'],
text: maps[i]['text'],
createdTime: maps[i]['createdTime'],
editedTime: maps[i]['editedTime'],
);
});
}
Future<void> updateMemo(Memo memo) async {
final db = await database;
await db.update(
tableName,
memo.toMap(),
where: "id = ?",
whereArgs: [memo.id],
);
}
Future<void> deleteMemo(String id) async {
final db = await database;
await db.delete(
tableName,
where: "id = ?",
whereArgs: [id],
);
}
}
(*) 기존에 이미 생성된 데이터가 있으면, 실행 시 에러가 발생할 수 있으므로, 타 에뮬레이터를 사용하던지 아니면 AVD 매니저에서 Wipe Data 항목을 선택하여 데이터를 삭제한다.
반응형
'Flutter Mobile App > Flutter 메모 앱' 카테고리의 다른 글
[Flutter] 메모 8 (0) | 2020.12.27 |
---|---|
[Flutter] 메모 7 (0) | 2020.12.27 |
[Flutter] 메모 5 (0) | 2020.12.27 |
[Flutter] 메모 4 (0) | 2020.12.27 |
[Flutter] 메모 3 (0) | 2020.12.27 |