LoginSignup
0
0

DriftにはDataClassを作成する際に'ies'を'y'に置換する仕様がある

Posted at

どんな挙動?

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を書いてみたのですが、すべての単語への対応が難しいとのことで、上記の回避策を教えてもらいました。
今後修正される可能性は低そうですね。

🐞issue
https://github.com/simolus3/drift/issues/2891

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0