溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flutter中的數(shù)據(jù)庫怎么使用

發(fā)布時間:2022-04-13 10:35:03 來源:億速云 閱讀:143 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“Flutter中的數(shù)據(jù)庫怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Flutter中的數(shù)據(jù)庫怎么使用”吧!

在Flutter開發(fā)過程中,我門有時候需要對一些數(shù)據(jù)進行本地的持久化存儲,使用sp文件形式雖然也能解決問題,但是有時數(shù)據(jù)量較大的時候,顯然我們文件形式就不太合適了,這時候我們就需要使用數(shù)據(jù)庫進行存儲,我們知道在原生中有系統(tǒng)提供的輕量級sqlite數(shù)據(jù)庫,在Flutter強大的生態(tài)環(huán)境中,也有這樣一個數(shù)據(jù)庫插件sqflite: ^2.0.2可以同時在Androud、iOS中進行數(shù)據(jù)庫操作。

1、 創(chuàng)建數(shù)據(jù)庫:這里我以存儲我的搜索歷史記錄為例

首先導入:

import 'package:sqflite/sqflite.dart';

這里我創(chuàng)建了一個數(shù)據(jù)庫幫助類,為了以后數(shù)據(jù)庫更新、升級等作準備:

代碼實現(xiàn):主要是對Database這個類的獲取進行了封裝。

/// 數(shù)據(jù)庫幫助類
class DbHelper {

  final String path = "laoli.db"; // 數(shù)據(jù)庫名稱 一般不變
 //數(shù)據(jù)庫中的表名字 這里是我存錯歷史搜索記錄的表
  static final searchTab = "SearchHistory";
   //私有構造
  DbHelper._();
  static DbHelper? _instance;
  static DbHelper get instance => _getInstance();
  factory DbHelper() {
    return instance;
  }
  static DbHelper _getInstance() {
    if (_instance == null) {
      _instance = DbHelper._();
    }
    return _instance ?? DbHelper._();
  }

/// 數(shù)據(jù)庫默認存儲的路徑
  /// SQLite 數(shù)據(jù)庫是文件系統(tǒng)中由路徑標識的文件。如果是relative,
  /// 這個路徑是相對于 獲取的路徑getDatabasesPath(),
  /// Android默認的數(shù)據(jù)庫目錄,
  /// iOS/MacOS的documents目錄。

  Future<Database>? _db;

  Future<Database>? getDb() {
    _db ??= _initDb();
    return _db;
  }

  // Guaranteed to be called only once.保證只調用一次
  Future<Database> _initDb() async {
  // 這里是我們真正創(chuàng)建數(shù)據(jù)庫的地方 vserion代表數(shù)據(jù)庫的版本,如果版本改變
  //,則db會調用onUpgrade方法進行更新操作
    final db =
        await openDatabase(this.path, version: 1, onCreate: (db, version) {
      // 數(shù)據(jù)庫創(chuàng)建完成
      // 創(chuàng)建表 一個自增id 一個text
db.execute("create table $searchTab (id integer primary key autoincrement, name text not null)");      
    }, onUpgrade: (db, oldV, newV) {
      // 升級數(shù)據(jù)庫調用 
    ///  db 數(shù)據(jù)庫
   ///   oldV 舊版本號
   //   newV 新版本號
   //   升級完成就不會在調用這個方法了
    });

return db;
  }

// 關閉數(shù)據(jù)庫
  close() async {
    await _db?.then((value) => value.close());
  }
}

java后臺開發(fā)過程中,數(shù)據(jù)庫肯定都會分層設計,這樣的好處可以在使用的過程中極大的提高代碼的健壯性以及降低后期的維護成本,在移動前端雖然我們用數(shù)據(jù)庫的地方跟后臺相比少之又少,但是我還是建議也對數(shù)據(jù)庫進行分層處理操作,雖然不分層也能實現(xiàn),但是這樣也可以降低我們的對于代碼的維護成本以及良好的編程習慣。廢話不多說,接下來我們需要創(chuàng)建處理數(shù)據(jù)的dao層。

這里sqflite封裝了一些常用的sql語法,比如增刪改查,我們就不需要自己去寫sql語法了,這里我簡答封裝了下增刪改查的方法。

具體代碼:

/// 數(shù)據(jù)操作類
class DbSearchHistoryDao {
  /// 增
  static insert(String text) {
    // 去重
    queryAll().then((value) {
      bool isAdd = true;
      for (var data in value) {
        if (data.name == text) {
          isAdd = false;
          break;
        }
      }
      if (isAdd) {
        DbHelper.instance.getDb()?.then((value) => value.insert(
              DbHelper.searchTab,
              DbSearchHotBean(name: text).toJson(),
            ));
      }
    });
  }

  /// 刪 全部
  static deleteAll() {
    DbHelper.instance.getDb()?.then((value) => value.delete(
          DbHelper.searchTab,
        ));
  }

  /// 更新數(shù)據(jù) 通過id更新表內具體行的數(shù)據(jù)
  static update(DbSearchHotBean dbSearchHotBean) {
    DbHelper.instance.getDb()?.then((value) => value.update(
      DbHelper.searchTab,
      dbSearchHotBean.toJson(),//具體更新的數(shù)據(jù)
      where: "id = ?"//通過id查找需要更新的數(shù)據(jù)
      ,whereArgs: [dbSearchHotBean.id]
    ));
  }

  /// 通過name查具體的實體類
  static Future<DbSearchHotBean?> getBean(String name) async {
  var db = await DbHelper.instance.getDb();
  var maps = await db?.query(DbHelper.searchTab,
    columns: ['id','name'],// 獲取實體類的哪些字段 默認全部
    where: 'name = ?',//通過實體類中的name字段
    whereArgs: [name]);//具體name的值 限定數(shù)據(jù)
  if(maps!=null && maps.length > 0) {
       return DbSearchHotBean.fromJson(maps.first);
  }
  return null;
  }

  /// 查 全部all
  static Future<List<DbSearchHotBean>> queryAll() async {
    List<DbSearchHotBean> list = [];
    await DbHelper.instance
        .getDb()
        ?.then((db) => db.query(DbHelper.searchTab).then((value) {
              for (var data in value) {
                list.add(DbSearchHotBean.fromJson(data));
              }
            }));
    return list;
  }
}

實體類:雖然只有一個字段,但是創(chuàng)建實體類方便以后擴展。

class DbSearchHotBean {
  int? id;
  String? name; // 搜索詞

  DbSearchHotBean({this.id,required this.name});

  DbSearchHotBean.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name = json['name'];
  }

  Map<String, String?> toJson() {
    var map = <String, String?>{};
    map['id'] = id?.toString() ;
    map['name'] = name ?? "";

    return map;
  }
}

具體用法就非常簡單了

增:DbSearchHistoryDao.insert(”搜索詞“);

刪全部:DbSearchHistoryDao.deleteAll();

改:例如將水改為火, 找到水的實體通過自增id修改name

DbSearchHistoryDao.getBean("水").then((value){
  if(value!=null){
    DbSearchHistoryDao.update(DbSearchHotBean(id: value.id,name: "火"));
  }
});

查全部:await DbSearchHistoryDao.queryAll();

到這里數(shù)據(jù)庫的基本用法就介紹完了,當然部分操作比如刪指定數(shù)據(jù),批量修改、批量刪除等操作可以用 到批處理操作,這里就不過多介紹了,有需要的可以查看作者文檔。鏈接

batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
results = await batch.commit();

感謝各位的閱讀,以上就是“Flutter中的數(shù)據(jù)庫怎么使用”的內容了,經過本文的學習后,相信大家對Flutter中的數(shù)據(jù)庫怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI