Windows PCでFlutterを使ってandroidアプリを作ってみる5 CRUD処理について
こんにちは。
FlutterアプリのCRUD処理について勉強します。これができたら幅が広がるので頑張って勉強したいです。
CRUD処理にも外部と内部がありますが、アプリ単体のみで動作させたいので内部でできるものを対象にします。
CRUD
C: Create
R: Read
U: Update
D: Delete
これにL:Listを加えた処理が幅広いアプリで使われています。これを勉強しておくといろんなものが作れるようになりますね。
ローカルデータベース
SQLiteもしくはhiveやIsarというデータベースを使うのが一般的なようです。
いくつも選択肢があるみたいですが有名どころは上の3つかな?
公式ドキュメントにあるのはSQLite、評判を見る限り今はhive? 今後はIsarになる感じでしょうか。
hiveとかIsarも気になりますが、とりあえず公式ドキュメントやサンプルがあるSQLiteを使おうと思います。
公式サンプル
DBのモデルは以下のように定義する必要があるようです。
class Dog {
final int id;
final String name;
final int age;
const Dog({
required this.id,
required this.name,
required this.age,
});
// Convert a Dog into a Map. The keys must correspond to the names of the
// columns in the database.
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'age': age,
};
}
// Implement toString to make it easier to see information about
// each dog when using the print statement.
@override
String toString() {
return 'Dog{id: $id, name: $name, age: $age}';
}
}
最初に型と名前を付けて、必須かどうかを指定。データベースとの対応するときのMapの定義、表示を確かめたいときのプリント設定などやってますね。
データ書き込む前にデータベースを開く必要があります。mainのところで開くデータベースの定義が必要なようです。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final database = openDatabase(
join(await getDatabasesPath(), 'doggie_database.db'),
onCreate: (db, version) {
// Run the CREATE TABLE statement on the database.
return db.execute(
'CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
);
},
version: 1,
);
あとは色々と挿入とか、削除とかの方法を紹介されていて動かしてみようと思ったんですが、
No implementation found for method getDatabasesPath on channel
com.tekartik.sqflite
というエラーがでてなんだろなと思って調べていたら、これってsqlfliteはデ
バッグ環境(Chorm)では動かないってことみたいですね。
そういえば対応表にありましたね。そういう意味だったのか。
エミュレーターとか実機なら動くようなので、androidstudioでエミュレータをやろうとしたところまたエラー。
HAXM installerがうんたらかんたらということで、色々とやらないといけないっぽいですね。それだったら、もう面倒だし、DBはhiveかisarにしようと思います。
ただ、今回は時間がないので(GW終わる)これで終わりで。まぁ方針が決まったので成果はあったかな。
また開発するときに覚えます。
ローカルストレージ
アプリの設定を保存したり、簡単なデータを保存しておくところ、Webで言えばLocalStrageとかcookieですかね。そういう役割としてはshared_preferencesというものがあるようです。
これも公式が出しているみたいで、単純なものならこれだけでもよさそうです。
使い方は、pubspec.yamlに入れてimport
Write
// Obtain shared preferences.
final prefs = await SharedPreferences.getInstance();
// Save an integer value to 'counter' key.
await prefs.setInt('counter', 10);
// Save an boolean value to 'repeat' key.
await prefs.setBool('repeat', true);
// Save an double value to 'decimal' key.
await prefs.setDouble('decimal', 1.5);
// Save an String value to 'action' key.
await prefs.setString('action', 'Start');
// Save an list of strings to 'items' key.
await prefs.setStringList('items', <String>['Earth', 'Moon', 'Sun']);
Read
// Try reading data from the 'counter' key. If it doesn't exist, returns null.
final int? counter = prefs.getInt('counter');
// Try reading data from the 'repeat' key. If it doesn't exist, returns null.
final bool? repeat = prefs.getBool('repeat');
// Try reading data from the 'decimal' key. If it doesn't exist, returns null.
final double? decimal = prefs.getDouble('decimal');
// Try reading data from the 'action' key. If it doesn't exist, returns null.
final String? action = prefs.getString('action');
// Try reading data from the 'items' key. If it doesn't exist, returns null.
final List<String>? items = prefs.getStringList('items');
まずはインスタンスを読み込んで、await~ Set ~で書き込み。Getで読み込みですね。
Keyを間違えないようにすればよさそうです。
大量のデータの検索は難しいですが、設定とかはこっちの方がよさそうですね。
削除は.removeでいけるみたいです。
ということでGWも終わりなのでFlutterの短期集中勉強会は終わり。勉強してみた感想。
色々とつぶしが効きそう
widget単位での考え方に慣れる必要がある
画面構築がなんとも面倒
装飾はキレイ
コードの見通しが悪い
ちょっと触った感触ですが、UIは良さげなのが最初から設定されているので簡単そうですね。ただ、画面構築はとても面倒ですね。HTML in CSS & JSって感じで、全部書いてる。これまで分離して来た身としてはもう少し簡素に書きたい気もするけどこれが時代の流れな感じ。そのせいかコードが簡単に肥大して括弧が大量に生まれて見通しが悪い気がする。なれなのかもだけど。
そんなことを思いました。いずれ使いこなせるようになりたいですね。
一通り眺められたのでよかったです。また実際に活用するときに勉強したいと思います。
良ければサポートお願いします。サポート費用はサーバー維持などの開発費に使わせていただきます。