著者 | Vlad
ソース | Vlad (公開アカウント: fulade_me)
スクフライト
データの永続化は、モバイル開発において不可欠な技術的手段です。ユーザー情報、アプリケーション リソース、リスト データなどを保存する必要があることが常にありますが、ここでは主に SQLite データベースに基づくデータ ストレージについて説明します。
SQLite は軽量のデータベースです。その設計対象は組み込みであり、多くの組み込み製品で使用されています。占有リソースは非常に少なく、組み込みデバイスではわずか数百 K のメモリで十分です。さらに詳しい情報については、Wikipedia、Baidu 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 では、パスはDocuments
Shahe パスの下のフォルダーにあり、Android では、デフォルトのデータベース ディレクトリです。次に、データベース操作オブジェクトを保存するオブジェクトを
宣言します。Database
Database db;
まず、このオブジェクトが存在するかどうかを確認し、存在しない場合は、openDatabase
オブジェクトを作成するために呼び出します
。ここで、データベース アドレス、バージョン番号、およびonCreate
前に取得したコールバック関数を渡します。
コールバックではonCreate
、使用する必要のあるテーブル名があるかどうかが判断され、存在しない場合はsql
データベース テーブルを作成するステートメントが実行されます。
コールバックの他に、、などのコールバック
onCreate
があります。別のパラメータは、同じデータベース パスが渡されたときに同じインスタンス オブジェクトを返すかどうかを示します。デフォルトは次のとおりです。onUpgrade
onDowngrade
onOpen
singleInstance
true
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
データを削除するテーブルの名前です。例: testTablewhere
削除する式ステートメントを表す文字列です。例: "id = ?"whereArgs
where
これは、ステートメント内の?
パラメーターを補足するために使用される配列です。例: [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
、ダウンロードして実行して体験することができます。