Flutterで既存のSQLiteファイルをインポートする方法

Gitを翻訳したものです。
引用: https://github.com/tekartik/sqflite/blob/master/sqflite/doc/opening_asset_db.md

assetに追加

  • ファイルシステム内のアセットをプロジェクトのルートに追加します。
    一般的にはassetsフォルダを作成し、その中にファイルを置きます。

    assets/example.db
  • アセット(複数可)を pubspec.yaml のflutterの下に指定します。

    flutter:
        assets:
            - assets/example.db

データベースをファイルシステムにコピーする

アセットから新たにコピーするのか、常にアセットをコピーするのか、それは使用方法によって異なります。

  • アセットデータベースを変更しますか?
  • 常にアセットからフレッシュなコピーを作成しますか?
  • パフォーマンスとサイズを最適化したいですか?

パフォーマンスのための最適化

パフォーマンスを上げるには、アセットを一度だけコピーし(最初の一度だけ)、それから
常にコピーを開こうとする


import 'package:path/path.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';

var databasesPath = await getDatabasesPath();
var path = join(databasesPath, "demo_asset_example.db");

// データベースが存在するかどうかを確認する
var exists = await databaseExists(path);

if (!exists) {
  // アプリケーションを最初に起動したときのみ発生するはずです
  print("Creating new copy from asset");

  // 親ディレクトリが存在することを確認する
  try {
    await Directory(dirname(path)).create(recursive: true);
  } catch (_) {}

  // アセットからコピー
  ByteData data = await rootBundle.load(join("assets", "example.db"));
  List<int> bytes =
  data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);

  // 書き込まれたバイトを書き込み、フラッシュする
  await File(path).writeAsBytes(bytes, flush: true);

} else {
  print("Opening existing database");
}
// DBファイルを開く
db = await openDatabase(path, readOnly: true);

サイズに合わせた最適化

iOSではさらに、アセットファイルのパスを取得するネイティブプラグインを書くことができます。
を直接読み取り専用で開くことができます。Androidにはそのような機能はありません。

アセットから常に新鮮なコピーを取得する

var databasesPath = await getDatabasesPath();
var path = join(databasesPath, "demo_always_copy_asset_example.db");

// 存在すれば削除
await deleteDatabase(path);

// 親ディレクトリが存在することを確認する
try {
  await Directory(dirname(path)).create(recursive: true);
} catch (_) {}

// アセットからコピー
ByteData data = await rootBundle.load(join("assets", "example.db"));
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await new File(path).writeAsBytes(bytes, flush: true);

// DBファイルを開く
var db = await openDatabase(path, readOnly: true);

カスタム戦略

アセットデータベースをコピーした時だけ、バージョン管理することもできます。(未完成)
または、ユーザーがデータベースを変更できるようにするかもしれません。(この場合最初にコピーする必要があります。)

開こう!

// DBファイルを開く
Database db = await openDatabase(path);

Flutter開発で知らないと損すること Flutter開発で知らないと損すること

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です