[Flutter 3-4] Flutter 上級チュートリアル - データ永続化 sqflite の使用

著者 | Vlad
ソース | Vlad (公開アカウント: fulade_me)

スクフライト

データの永続化は、モバイル開発において不可欠な技術的手段です。ユーザー情報、アプリケーション リソース、リスト データなどを保存する必要があることが常にありますが、ここでは主に SQLite データベースに基づくデータ ストレージについて説明します。
SQLite は軽量のデータベースです。その設計対象は組み込みであり、多くの組み込み製品で使用されています。占有リソースは非常に少なく、組み込みデバイスではわずか数百 K のメモリで十分です。さらに詳しい情報については、WikipediaBaidu Encyclopediaを参照してください。
Flutter は、SQLite を操作するためのライブラリ ( sqflite)のカプセル化に役立ちました。

sqflite ライブラリを統合する

sqfliteサードパーティのライブラリを使用するには、pubspec.yamlライブラリの名前とバージョン番号をファイルに追加し、フィールド
の下に追加する必要があります。dependencies

sqflite: ^1.1.3

これを1.1.3例として
、追加後に保存します。VSCode は、pub get必要なライブラリをダウンロードするためにデフォルトで実行します。同様に、プロジェクトのルート ディレクトリで実行して、pub get必要なライブラリを手動でプルすることもできます。

1. ローカルデータファイルを作成する

static Future<SqfliteManager> _initDataBase() async {
SqfliteManager manager = SqfliteManager();
String dbPath = await getDatabasesPath() + "/$sqlName";
if (manager.db == null) {
    manager.db = await openDatabase(
    dbPath,
    version: 1,
    onCreate: (db, version) async {
        /// 如果不存在 当前的表 就创建需要的表
        if (await manager.isTableExit(db, tableName) == false) {
        await db.execute(CREATE_DATA_TABLE);
        }
    },
    );
}
return manager;
}

まず、getDatabasesPath()関数を通じてデータベース ファイルをローカルに保存するパスを取得し、このパスの後にデータベース ファイル名を結合します。これがデータベース ファイルを保存するパスです。iOS では、パスはDocumentsShahe パスの下のフォルダーにあり、Android では、デフォルトのデータベース ディレクトリです。次に、データベース操作オブジェクトを保存するオブジェクトを
宣言します。Database

Database db;

まず、このオブジェクトが存在するかどうかを確認し、存在しない場合は、openDatabaseオブジェクトを作成するために呼び出します
。ここで、データベース アドレス、バージョン番号、およびonCreate前に取得したコールバック関数を渡します。
コールバックではonCreate、使用する必要のあるテーブル名があるかどうかが判断され、存在しない場合はsqlデータベース テーブルを作成するステートメントが実行されます。

コールバックの他になどのコールバックonCreateがあります。別のパラメータは、同じデータベース パスが渡されたときに同じインスタンス オブジェクトを返すかどうかを示します。デフォルトは次のとおりです。onUpgradeonDowngradeonOpensingleInstancetrue

2. データを挿入する

sqflite多くの作業を行ってくれたので、基本的な、を使用するのも非常に簡単です。

  /// 插入数据
  Future<int> insertData(Map<String, dynamic> value) async {
    return await db.insert(tableName, value);
  }

テーブル名と挿入するデータを渡すだけで済みます。関数の他のパラメーター
を見てみましょう。insert

Future<int> insert(String table, Map<String, dynamic> values,
      {String nullColumnHack, ConflictAlgorithm conflictAlgorithm});
  • nullColumnHack は、受信した挿入データが空の場合に機能します
    。 挿入データが空の
    場合: nullColumnHack を追加しない場合、SQL ステートメントの最終結果は、許可されていない tableName()values() への insert と同様になります。
    nullColumnHackを追加するとSQL文がtableName(nullColumnHack)values(null)にinsertすることが可能になります。
  • conflictAlgorithm は列挙であり、挿入されたデータに競合またはエラーがある場合に使用する戦略を次の値で表します。
enum ConflictAlgorithm {
  rollback,
  abort,
  fail,
  ignore,
  replace,
}

3. データを削除する

データを削除するコードは次のとおりです

  /// 删除一条数据
Future<int> deleteData(int id) async {
    return await db.delete(tableName, where: "id = ?", whereArgs: [id]);
}

詳細な関数のパラメータを見てみましょうdelete

Future<int> delete(String table, {String where, List<dynamic> whereArgs});
  • tableデータを削除するテーブルの名前です。例: testTable
  • where削除する式ステートメントを表す文字列です。例: "id = ?"
  • whereArgswhereこれは、ステートメント内の?パラメーターを補足するために使用される配列です。例: [2]
    上記のパラメーターの例を渡すとき、マークの意味は次のとおりです: testTable テーブル内の id = 2 のデータを削除します

4. データの更新

データを削除するコードは次のとおりです

Future<int> updateData(Map<String, dynamic> value, int id) async {
    return await db.update(
        tableName,
        value,
        where: "id = ?",
        whereArgs: [id],
    );
}

詳しいupdate機能は以下の通り

Future<int> update(String table, Map<String, dynamic> values,
      {String where,
      List<dynamic> whereArgs,
      ConflictAlgorithm conflictAlgorithm});

insert基本的には関数のパラメータと同じなので、ここでは詳しく説明しませ

5. データのクエリ

クエリ ステートメントのパラメータを直接確認する

Future<List<Map<String, dynamic>>> query(
    String table,  /// 表名字 是必传参数
    {bool distinct,  // 是否包含重复数据
    List<String> columns,  // 需要查询的列
    String where,       //  查询条件
    List<dynamic> whereArgs, // 查询条件参数
    String groupBy,  //按列分组 列的名字
    String having,   // 给分组设置条件
    String orderBy,   // 按列排序 asc/desc
    int limit,     // 限制查询结果数量
    int offset});  // 从第几条开始查询

クエリ ステートメントのパラメーターは比較的豊富で、基本的にはいくつかの複雑なシナリオのクエリ要件を満たすことができます。

さて、sqfliteの使い方については以上です。

上記の例の実行効果を体験したい場合は、私の Github ウェアハウスプロジェクトflutter_app-> lib-> routes-> viewに移動しsqflite_page.dart、ダウンロードして実行して体験することができます。


一般公開なし

おすすめ

転載: blog.csdn.net/u012405234/article/details/113753131