Flutter——數據庫Drift開發詳細教程(六)

目錄

  • 1.視圖
  • 2.視圖中列的可空性
  • 3.DAO
  • 4.流查詢
  • 5.高級用途
  • 6.注意事項

1.視圖

也可以將SQL 視圖定義 為 Dart 類。為此,請編寫一個抽象類來擴展View。此示例聲明了一個視圖,用于讀取示例中架構中某個類別中添加的待辦事項數量:

abstract class CategoryTodoCount extends View {// Getters define the tables that this view is reading from.Todos get todos;Categories get categories;// Custom expressions can be given a name by defining them as a getter:.Expression<int> get itemCount => todos.id.count();Query as() =>// Views can select columns defined as expression getters on the class, or// they can reference columns from other tables.select([categories.description, itemCount]).from(categories).join([innerJoin(todos, todos.category.equalsExp(categories.id))]);
}

在 Dart 視圖中,使用

  • 抽象 getter 來聲明您將從中讀取的表(例如TodosTable get todos)。
  • Expressiongetter 添加列:(例如itemCount => todos.id.count())。
  • as用于定義支持視圖的 select 語句的重寫方法。 中引用的列select可能指兩種類型的列:
  • 在視圖本身上定義的列(itemCount如上例所示)。
  • 在引用表上定義的列(如categories.description示例中所示)。對于這些引用,
    表中列定義中使用的類型轉換器等高級漂移功能也會應用于視圖的列。

當被選中時,兩種類型的列都將添加到視圖的數據類中。

最后,需要通過將視圖包含在參數中來將其添加到數據庫或訪問器中 views:

(tables: [Todos, Categories], views: [CategoryTodoCount])
class MyDatabase extends _$MyDatabase {

2.視圖中列的可空性

對于 Dart 定義的視圖,定義為Expressiongetter 的 表達式始終可空。此行為與TypedResult.read(用于從包含自定義列的復雜 select 語句中讀取結果的方法)匹配。

如果引用的列可為空,或者所選表不是來自內連接(因為null在這種情況下整個表可能都是內連接),則引用另一個表的列的列可為空。

從上面的例子來看,

  • itemCount列可為空,因為它被定義為復雜 Expression
  • description引用 的列不可categories.description為空。這是因為它引用了categories,即視圖
    select 語句的主表。

3.DAO

當你有大量查詢時,將它們全部放入一個類中可能會變得繁瑣。你可以通過將一些查詢提取到主數據庫類中可用的類中來避免這種情況。考慮以下代碼:

part '../Dart API/todos_dao.g.dart';// the _TodosDaoMixin will be created by drift. It contains all the necessary
// fields for the tables. The <MyDatabase> type annotation is the database class
// that should use this dao.
(tables: [Todos])
class TodosDao extends DatabaseAccessor<MyDatabase> with _$TodosDaoMixin {// this constructor is required so that the main database can create an instance// of this object.TodosDao(MyDatabase db) : super(db);Stream<List<TodoEntry>> todosInCategory(Category category) {if (category == null) {return (select(todos)..where((t) => isNull(t.category))).watch();} else {return (select(todos)..where((t) => t.category.equals(category.id))).watch();}}
}

如果我們現在將類上的注釋更改MyDatabase為**@DriftDatabase(tables: [Todos, Categories], daos: [TodosDao])** 并重新運行代碼生成,todosDao則可以使用生成的 getter 來訪問該 dao 的實例。

4.流查詢

漂移的核心特性是每個查詢都可以轉換為自動更新流。無論查詢返回單行還是多行,無論查詢是從單個表讀取還是連接多個表,這都能正常工作。

基礎知識?
在drift中,可運行的查詢由接口表示Selectable,該接口具有以下方法:

  • Future<List> get():運行一次查詢,返回所有行。
  • Future getSingle():運行查詢一次,斷言它產生返回的一行。
  • Future<T?> getSingleOrNull():類似getSingle(),但允許返回null空結果集。

并且每個方法都有一個匹配的**watch()**返回流的方法:

  • Stream<List> watch():監視查詢,返回所有行。
  • Stream watchSingle():監視查詢,斷言每次運行查詢時都會報告一行。
  • Stream<T?> watchSingleOrNull():類似watchSingle(),但返回空結果集null。

用于構建查詢的所有漂移 API 都會返回一個Selectable可以監視的內容:

Selectable<TodoItem> allItemsAfter(DateTime min) {return select(todoItems)..where((row) => row.createdAt.isBiggerThanValue(min));
}

無論使用哪種方法,都可以使用 創建流allItemsAfter(value).watch()。由于StreamDart 中的常見構建塊,因此大多數框架都可以使用它們:

  • Flutter 中,您可以使用 以聲明方式監聽流StreamBuilder
  • Riverpod 可以使用 來包裝流。示例應用StreamProvider中也使用了此技術。

所有漂移流在監聽之后都會發出最新的結果(因此即使表從未改變,您也會收到快照,而不必合并get()watch())。

5.高級用途

除了監聽查詢之外,您還可以直接監聽表上的更新事件:

Future<void> listenForUpdates() async {final stream = tableUpdates(TableUpdateQuery.onTable(todoItems,limitUpdateKind: UpdateKind.update,));await for (final event in stream) {print('Update on todos table: $event');}
}

請注意,整個查詢流功能都是以漂移方式實現的,因此流更新是一種啟發式方法,可能會比必要的更頻繁地觸發。您也可以手動將表標記為已更新:

void markUpdated() {notifyUpdates({TableUpdate.onTable(todoItems, kind: UpdateKind.insert)});
}

6.注意事項

雖然流對于自動獲取您正在運行的任何查詢的更新非常有用,但了解其功能和局限性至關重要。流查詢在漂移中以啟發式方法實現:對于每個活動流,漂移會跟蹤其正在監聽的表(該信息可從查詢構建器獲取)。每當通過漂移 API 進行插入、更新或刪除操作時,相關查詢都會重新安排并再次運行。

這意味著:

  1. 數據庫的其他用途(例如原生 SQLite 客戶端)不會觸發流查詢更新。您可以手動注入更新作為解決方法。
  2. 流查詢的更新頻率通常會超出其應有的水平,因為我們無法僅篩選特定行的更新。這通常不是問題,但需要注意。流查詢通常應該返回相對較少的行,并且執行時的計算開銷不應過大。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83145.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka 4.0版本的推出:數據處理新紀元的破曉之光

之前做大數據相關項目&#xff0c;在項目中都使用過kafka。在數字化時代&#xff0c;數據如洪流般涌來&#xff0c;如何高效處理這些數據成為關鍵。Kafka 就像是一條 “智能數據管道”&#xff0c;在數據的世界里扮演著至關重要的角色。如果你第一次接觸它&#xff0c;不妨把它…

RabbitMQ高級篇-MQ的可靠性

目錄 MQ的可靠性 1.如何設置數據持久化 1.1.交換機持久化 1.2.隊列持久化 1.3.消息持久化 2.消息持久化 隊列持久化&#xff1a; 消息持久化&#xff1a; 3.非消息持久化 非持久化隊列&#xff1a; 非持久化消息&#xff1a; 4.消息的存儲機制 4.1持久化消息&…

ctfshow權限維持

1&#xff0c;web670 我們先看一下這個php代碼 error_reporting(0);#關閉錯誤報告 highlight_file(__FILE__);#內容高亮顯示$a$_GET[action];#get傳參switch($a){case cmd:eval($_POST[cmd]);break;case check:file_get_contents("http://checker/api/check");#獲取…

力扣算法ing(71 / 100)

5.15 哈希表合集—349.兩個數組的交集 給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2]示例…

(面試)Handler消息處理機制原理

Handler是用于實現線程間通信和任務調度的一種機&#xff08;Handler、 Looper、MessageQueue、 Message&#xff09;。Handler 允許線程間發送Message或Runnable對象進行通信。在Android中UI修改只能通過UI Thread&#xff0c;子線程不能更新UI。如果子線程想更新UI&#xff0…

Dify 實戰教程 | 5分鐘打造文本生成應用( Stable Diffusion 提示詞生成器)

AI 繪畫離不開「提示詞&#xff08;Prompt&#xff09;」——如何構造清晰、生動、有表現力的提示詞&#xff0c;直接決定你生成圖像的質量。而 Stable Diffusion 的提示詞構造相比 Midjourney 更加自由&#xff0c;但也更考驗組織語言的能力。 今天這篇教程&#xff0c;教你零…

RPC框架源碼分析學習(二)

RPC框架源碼分析與原理解讀 前言 在分布式系統開發中&#xff0c;遠程過程調用(RPC)是一項基礎且關鍵的技術。通過對KVstorageBaseRaft-cpp項目RPC模塊的源碼分析&#xff0c;我深入理解了RPC框架的工作原理和實現細節。本文將從程序員視角分享我的學習心得。 框架概述 本項…

當下流行的智能體通信協議:MCP、A2A、ANP 分別是什么?

在當前人工智能&#xff08;AI&#xff09;智能體生態系統中&#xff0c;智能體之間的有效溝通至關重要。為了讓AI智能體能夠高效、安全地協同工作&#xff0c;業界提出了多種通信協議。其中&#xff0c;MCP、A2A 和 ANP 代表了三個關鍵層級的通信協議&#xff0c;各自應對不同…

為什么 cout<<“中文你好“ 能正常輸出中文

一, 簡答: 受python3字符串模型影響得出的下文C字符串模型結論 是錯的&#xff01;C的字符串和python2的字符串模型類似&#xff0c;也就是普通的字符串是ASCII字符串和字節串兩種語義&#xff0c;類似重載或多態&#xff0c;有時候解釋為整數&#xff0c;有時候是字節串。Uni…

鴻蒙的卓易通,讓我踩了一次坑

前言 因為我本身對鴻蒙提不起興趣&#xff0c;哪怕有些文章給鴻蒙穿上了“黑絲”&#xff0c;再加上公司當前沒有適配鴻蒙的計劃&#xff0c;所以關于鴻蒙的消息我都關注的很少。 今早&#xff0c;看到了徐宜生老師的一篇文章&#xff1a;“鴻蒙卓易通&#xff0c;是飲鴆止渴…

Cursor vs VS Code vs Zed

代碼編輯器的世界已經迎來了創新的爆發。曾經由重量級IDE或基礎文本編輯器主導的領域,如今開發者們發現自己正在探索全新一波聚焦于AI集成、協作和性能的工具。 在本文中,我們將深入探討2025年三款流行的編輯器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…

使用 LiteFlow 實現靈活的業務邏輯解耦

1. 引言 1.1 業務邏輯復雜性帶來的挑戰 在現代軟件開發中,隨著業務需求不斷增長,代碼結構日趨復雜。硬編碼式的流程控制方式難以適應頻繁變更的需求,導致維護成本高、可讀性差、擴展性弱。 1.2 規則引擎在解耦中的作用 規則引擎(Rule Engine)通過將業務邏輯與程序代碼…

以項目的方式學QT開發(一)——超詳細講解(120000多字詳細講解,涵蓋qt大量知識)逐步更新!

以項目的方式學QT開發 以項目的方式學QT開發 P1 QT介紹 1.1 QT簡介 1.2 QT安裝 1.2.1 Windows QT安裝 1.2.2 QT Creator 使用基本介紹 P2 C基礎 2.1 命名空間 2.1.1 命名空間作用 2.1.2 自定義命名空間 2.2 從C語言快速入門 2.2.1 輸入輸出 2.2.2 基…

【前端】【css】【總復習】三萬字詳解CSS 知識體系

&#x1f308; CSS 知識體系目錄大綱 一、基礎知識入門 1. CSS 簡介與作用 CSS&#xff08;Cascading Style Sheets&#xff0c;層疊樣式表&#xff09;是一種用于給 HTML 頁面添加樣式的語言&#xff0c;作用是讓網頁更美觀、結構更清晰、布局更靈活。 核心作用&#xff1a;…

R利用spaa包計算植物/微生物的生態位寬度和重疊指數

一、生態位寬度 生態位寬度指數包括shannon生態位指數和levins生態位指數。下面是采用levins方法計算生態位寬度。method也可以選擇“shannon”。 二、生態位重疊指數 生態位重疊指數&#xff0c;包括levins生態位重疊指數、schoener生態位重疊指數、petrai…

【論信息系統項目的合同管理】

論信息系統項目的合同管理 論文要求寫作要點正文前言一、合同的簽訂管理二、合同履行管理三、合同變更管理四、合同檔案管理五、合同違約索賠管理結語 論文要求 項目合同管理通過對項目合同的全生命周期進行管理&#xff0c;來回避和減輕可識別的項目風險。 請以“論信息系統項…

最新網盤資源搜索系統,電視直播,Alist聚合播放

源碼描述&#xff1a; 本項目是基于Vue與Nuxt.js技術構建的網盤搜索項目&#xff0c;持續開源并維護更新。該項目旨在使每個人都能擁有屬于自己的網盤搜索網站。我們強烈建議用戶自行部署該項目。 更新日志&#xff1a; 新增TV播放功能新增Alist源聚合播放功能新增批量刪除功…

【Ubuntu】安裝BitComet種子下載器

環境 Ubuntu 24.04.2 下載依賴庫 環境比較新&#xff0c;此軟件需要依賴很多舊的庫&#xff0c;逐個安裝下載&#xff1a; 1.libicu70 http://nz.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu70_70.1-2_amd64.deb2.libjavascriptcoregtk-4.0-18 http://security.ubu…

修復“ImportError: DLL load failed while importing lib: 找不到指定的程序”筆記

#工作記錄 一、問題描述 在運行CosyVoice_For_Windows項目時&#xff0c;出現以下報錯&#xff1a; Traceback (most recent call last): File "D:\ProgramData\anaconda3\envs\CosyVoice\Lib\pydoc.py", line 457, in safeimport module __import__(path) …

ubuntu18 設置靜態ip

百度 編輯/etc/netplan/01-netcfg.yaml 系統沒有就自己編寫 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.20.8/24] # 設置你的IP地址和子網掩碼 gateway4: 192.168.20.1 # 網關地址 namese…