Flutter 中集成SQLite查询的插件库hrana的使用

Flutter 中集成SQLite查询的插件库hrana的使用

hrana 是一个Dart实现的包,用于支持通过WebSockets暴露sqlite3数据库的libsql服务器的Hrana协议。这个插件可以用来在Flutter应用中执行SQLite查询,提供了一种轻量级的数据存储解决方案。

开始使用

首先,你需要有一个可以连接的服务器。对于测试目的,你可以启动一个临时的sqld容器:

docker run -p 8080:8080 -ti -e SQLD_NODE=primary ghcr.io/tursodatabase/libsql-server:latest

使用方法

有了运行中的服务器,此包仅需要WebSocket URI即可连接,也可以选择性地提供JWT令牌进行授权:

import 'package:hrana/hrana.dart';

void main() async {
  final database = await Database.connect(
    Uri.parse('ws://localhost:8080/'),
    jwtToken: null,
  );
  print(await database.withSession((session) async {
    return await session.select('SELECT 1;');
  }));
}

除了WebSockets之外,当使用http://https:// URL时,HTTP客户端也会被自动选择。

示例Demo

以下是一个完整的示例demo,展示了如何在Flutter应用中使用hrana插件来执行简单的SQL查询:

import 'package:flutter/material.dart';
import 'package:hrana/hrana.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Hrana Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String queryResult = 'Query Result will appear here';

  void _executeQuery() async {
    try {
      final database = await Database.connect(
        Uri.parse('ws://localhost:8080/'),
        jwtToken: null,
      );
      setState(() {
        queryResult = 'connected!';
      });

      final result = await database.withSession((session) async {
        return await session.select('SELECT 1;');
      });
      
      setState(() {
        queryResult = result.toString();
      });

      await database.close();
    } catch (e) {
      setState(() {
        queryResult = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Hrana Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(queryResult),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _executeQuery,
              child: Text('Execute Query'),
            ),
          ],
        ),
      ),
    );
  }
}

额外信息

目前,该包实现了执行语句和获取其结果作为行的功能。批次和存储语句也得到了支持,但尚未实现流式游标的支持。

贡献

欢迎贡献更多关于hrana协议的功能!如果需要重新运行protoc编译器,首先运行:

$ dart pub global activate protoc_plugin

更多关于Flutter 中集成SQLite查询的插件库hrana的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部