Open6

[flutter]driftを触ってみる

はやぶさはやぶさ

疑問

SQLiteはOSに入っているものを使っているのか、ライブラリ側で用意しているのか?

疑問を持った理由

upsertを使っていいのかわからなかったため。
https://www.sqlite.org/lang_upsert.html

UPSERT syntax was added to SQLite with version 3.24.0 (2018-06-04).

Upsertは3.24 から入っている

AndroidOSごとのSQliteのバージョン
Version of SQLite used in Android?

30 11 R 3.28.0 window functions
29 10 Q 3.22.0

ということは Android R 以降じゃないと Upsert(on conflict update) は使えない??

結論

upsertも使える。
sqlite3_flutter_libs が最新のSQLiteを内包しているので、OSのSQLiteは気にしなくて良い。

調査

driftはsqlite3_flutter_libsと一緒に使う
https://drift.simonbinder.eu/docs/getting-started/

dependencies:
  drift: ^1.6.0
  sqlite3_flutter_libs: ^0.5.0
  path_provider: ^2.0.0
  path: ^1.8.1

sqlite3_flutter_libs: Ships the latest sqlite3 version with your Android or iOS app. This is not required when you're not using Flutter, but then you need to take care of including sqlite3 yourself. For an overview on other platforms, see platforms.

(deepL訳) sqlite3_flutter_libs: 最新の sqlite3 バージョンを Android または iOS アプリと一緒に出荷する。

sqlite3_flutter_libs の内部調査

pubspec.lock
  sqlite3_flutter_libs:
    dependency: "direct main"
    description:
      name: sqlite3_flutter_libs
      url: "https://pub.dartlang.org"
    source: hosted
    version: "0.5.6"

https://github.com/simolus3/sqlite3.dart/blob/84d6f96ca1b50e84671224f7cd705f1e916a3a4e/sqlite3_flutter_libs/CHANGELOG.md#056

CHANGELOG.md
0.5.6
Update sqlite to version 3.38.3

sqliteのバージョン管理してるっぽい

コード仕込んで確認

mainとかで以下のコードを仕込んで確認
Android OS 5.1のエミュレータ でも 3.38.3 が出力された

main.dart
import 'package:sqlite3/sqlite3.dart';

logger.i('use sqlite3 ${sqlite3.version}');
// use sqlite3 Version(libVersion: 3.38.3, sourceId: 2022-04-27 12:03:15 9547e2c38a1c6f751a77d4d796894dec4dc5d8f5d79b1cd39e1ffc50df7b3be4, number: 3038003)

SQLiteを取り込んでる箇所

Android

https://github.com/simolus3/sqlite3.dart/blob/84d6f96ca1b50e84671224f7cd705f1e916a3a4e/sqlite3_flutter_libs/android/build.gradle

    implementation 'eu.simonbinder:sqlite3-native-library:3.38.5'

https://github.com/simolus3/sqlite-native-libraries

Android library containing a precompiled version of sqlite3.

iOS

https://github.com/simolus3/sqlite3.dart/blob/84d6f96ca1b50e84671224f7cd705f1e916a3a4e/sqlite3_flutter_libs/ios/sqlite3_flutter_libs.podspec

  s.dependency 'sqlite3', '~> 3.38.5'

https://cocoapods.org/pods/sqlite3

SQLite is an embedded SQL database engine

はやぶさはやぶさ

デフォルトだとforeign key が効かない
SQLiteの特徴っぽい。以下で効くようになる

  MigrationStrategy get migration => MigrationStrategy(
    beforeOpen: (details) async {
      await customStatement('PRAGMA foreign_keys = ON');
    },
  );

参考