どんな挙動?
Driftではテーブル名を単数形にした名称のデータクラスを作成してくれます。
このデータクラスを作成するときに、通常であれば単語の末尾のs
を除いて作成してくれるのですが、末尾がies
の場合に自動でy
に置換されます。
基本的には上記の挙動で、ある程度の単語はいい感じに変換してくれるのですが、MoviesやBoxesなど一部適切に変換してくれない場合があります。
データクラスを作成する際の名称は以下のようになります。
テーブル名 | DataClass名 |
---|---|
TodoItems | TodoItem |
Categories | Category |
Movies | Movy |
Boxes | Boxe |
予期しない変換をされた場合の対処
DataClassName
というアノテーションが用意されているので、こちらを使用しましょう。
使用例
@DataClassName('Movie')
class Movies extends Table {
IntColumn get id => integer().autoIncrement()();
}
@DataClassName('Box')
class Boxes extends Table {
IntColumn get id => integer().autoIncrement()();
}
補足
DataClassってなに?
Driftでテーブルを作成後build_runnerを実行すると一緒にDataClassを継承したクラスを作成してくれます。
このDataClassはテーブルの1行単位を表すクラスです。
公式のsetup項のNextStepのあたりにちらっと出てくるのですが、
https://drift.simonbinder.eu/docs/getting-started/#next-steps
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final database = AppDatabase();
await database.into(database.todoItems).insert(TodoItemsCompanion.insert(
title: 'todo: finish drift setup',
content: 'We can now write queries and define our own tables.',
));
// 👇ここで唐突に出てくる「TodoItem」がDataClass
List<TodoItem> allItems = await database.select(database.todoItems).get();
print('items in database: $allItems');
}
公式ページでDataClassについて説明しているところを探してみたのですが、見つかりませんでした...。
知っている方がいれば教えてください。
対処しないといつ困るの?
例えば、Selectした結果の戻り値の型定義
// 👇ここで`Movie`がないとか`Box`がないとかで怒られます。
Future<List<Movie>> get allTodoItems => select(movies).get();
Future<List<Box>> get allTodoItems => select(boxes).get();
終わりに
この件についてissueを書いてみたのですが、すべての単語への対応が難しいとのことで、上記の回避策を教えてもらいました。
今後修正される可能性は低そうですね。