Flutter数据库交互插件harperdb的使用

Flutter数据库交互插件HarperDB的使用

安装

打开你的项目,并在终端输入以下命令:

flutter pub add harperdb

使用

导入插件包:

import 'package:harperdb/harperdb.dart';

设置你的HDB_URL, HDB_USER, 和 HDB_PASSWORD变量,以便在应用中使用:

const HDB_URL = 'https://hdb-publicdemo.harperdbcloud.com';
const HDB_USER = 'HDB_READER';
const HDB_PASSWORD = 'password';

构建你的函数(必须是异步类型Future):

// 函数必须是异步的
// 对于查询操作,返回类型为<List>
// 对于插入、更新、删除等操作,返回类型为<Map>

Future<List> loadData() async {
  var show = await harperDB(
    HDB_URL,
    HDB_USER,
    HDB_PASSWORD,
    {
      // 包含HarperDB的操作语法
      "operation": "sql",
      "sql": "select * from dev.dog"
    },
  );
  // 这将显示查询是否成功执行
  debugPrint(
    show.toString(),
  );
  // 设置查询结果到列表中并返回
  setState(() {
    harperData = show;
  });
  // 返回函数声明的类型
  return harperData;
}

在初始化时调用你的函数:

[@override](/user/override)
void initState() {
  queryHarperDB = loadData();
  super.initState();
}

为了显示查询结果,使用FutureBuilder确保数据已从API返回:

[@override](/user/override)
Widget build(BuildContext context) {
  return Scaffold(
    body: FutureBuilder(
      future: queryHarperDB,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(child: CircularProgressIndicator());
        } else if (snapshot.connectionState == ConnectionState.done) {
          return ListView.builder(
            itemCount: harperData.length,
            itemBuilder: (context, index) {
              return ListTile(
                leading: Text(
                  harperData[index]['dog_name'],
                ),
                title: Text(
                  harperData[index]['owner_name'],
                  textAlign: TextAlign.center,
                ),
                trailing: Text(
                  harperData[index]['dog_age'].toString(),
                ),
              );
            },
          );
        } else {
          return const Center(
              child: Text("Something went wrong."));
        }
      },
    ),
  );
}

注意事项

函数的返回类型取决于你执行的HarperDB操作。查询操作将返回<List>,而插入、更新、删除等操作将返回<Map>

示例代码

以下是完整的示例代码:

// 根据平台应用的不同,可以是Cupertino(iOS)或Material(Dart),这完全取决于您的选择
import 'package:flutter/material.dart';
// 这是一个必要的文件,用于调用HarperDB包中的自定义函数
import 'package:harperdb/harperdb.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  // 这是你的全局Url变量
  final String hDBURL = 'https://hdb-publicdemo.harperdbcloud.com';
  // 这是全局用户名变量
  final String hDBUSER = 'HDB_READER';
  // 这是全局密码变量
  final String hDBPASSWORD = 'password';

  // 这处理你的返回类型,可以是查询搜索的<List>或插入查询的<Map>
  late List harperData;

  // 只是一个名为harperAPI的future
  late Future harperAPI;

  // 这必须是一个future函数,因为它会等待来自API的数据
  // 函数的返回类型根据操作的不同而变化,可以在Map或List之间切换
  Future<List> // 函数类型声明为future
      loadData() // 函数名称
  async // 必须是异步的
  {
    var show = await harperDB(
      // 一个名为show的变量被分配了函数的结果
      hDBURL,
      hDBUSER,
      hDBPASSWORD,
      {"operation": "sql", "sql": "select * from dev.dog"},
    );
    // 这将显示查询是否成功执行。查询结果将在终端中显示
    debugPrint(
      show.toString(),
    );
    // 设置查询结果到列表中并返回
    setState(() {
      harperData = show;
    });
    // 返回函数声明的类型
    return harperData;
  }

  // 初始化函数以便在页面打开时运行
  [@override](/user/override)
  void initState() {
    harperAPI = loadData();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder(
        // 该小部件用于在获取结果后显示数据
        future: harperAPI,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            // 当等待来自数据库的结果时,此代码块将显示一个圆形进度小部件
            return const Center(child: CircularProgressIndicator());
          } else if (snapshot.connectionState == ConnectionState.done) {
            // 当从数据库获取数据时,此代码块将解释要做什么
            return ListView.builder(
              itemCount: harperData.length,
              itemBuilder: (context, index) {
                return ListTile(
                  leading: Text(
                    harperData[index]['dog_name'],
                  ),
                  title: Text(
                    harperData[index]['owner_name'],
                    textAlign: TextAlign.center,
                  ),
                  trailing: Text(
                    harperData[index]['dog_age'].toString(),
                  ),
                );
              },
            );
          } else {
            // 如果出现错误,此代码块将说明要做什么
            return const Center(child: Text("Something went wrong."));
          }
        },
      ),
    );
  }
}

更多关于Flutter数据库交互插件harperdb的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库交互插件harperdb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用HarperDB作为数据库交互插件的示例代码。HarperDB是一个多模型数据库,支持SQL、NoSQL和GraphQL,但在Flutter中直接使用HarperDB的插件可能不常见,因此这里假设你已经有一个HarperDB实例运行,并且你已经了解如何通过API与其交互。

在Flutter中,我们通常使用HTTP请求来与后端数据库API进行交互。这里我们将使用http包来发送请求到HarperDB的REST API。

首先,你需要在pubspec.yaml文件中添加http依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保使用最新版本

然后,运行flutter pub get来安装依赖。

接下来,你可以创建一个服务类来处理与HarperDB的交互。以下是一个简单的示例:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class HarperDBService {
  final String baseUrl = 'https://your-harperdb-instance.com/api'; // 替换为你的HarperDB实例URL
  final String db = 'your_database'; // 替换为你的数据库名称
  final String apiKey = 'your_api_key'; // 替换为你的API密钥

  Future<Map<String, dynamic>> insertData(String collection, Map<String, dynamic> data) async {
    final url = '$baseUrl/v1/$db/$collection';
    final headers = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer $apiKey',
    };
    final body = jsonEncode(data);

    final response = await http.post(
      Uri.parse(url),
      headers: headers,
      body: body,
    );

    if (response.statusCode == 200) {
      return jsonDecode(response.body);
    } else {
      throw Exception('Failed to insert data: ${response.statusCode} ${response.reasonPhrase}');
    }
  }

  Future<List<Map<String, dynamic>>> fetchData(String collection) async {
    final url = '$baseUrl/v1/$db/$collection';
    final headers = {
      'Authorization': 'Bearer $apiKey',
    };

    final response = await http.get(
      Uri.parse(url),
      headers: headers,
    );

    if (response.statusCode == 200) {
      return jsonDecode(response.body)['data'] as List<Map<String, dynamic>>;
    } else {
      throw Exception('Failed to fetch data: ${response.statusCode} ${response.reasonPhrase}');
    }
  }
}

在这个服务类中,我们定义了两个方法:insertData用于插入数据,fetchData用于获取数据。

以下是如何在Flutter应用中使用这个服务类的示例:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HarperDBDemo(),
    );
  }
}

class HarperDBDemo extends StatefulWidget {
  @override
  _HarperDBDemoState createState() => _HarperDBDemoState();
}

class _HarperDBDemoState extends State<HarperDBDemo> {
  final HarperDBService _harperDBService = HarperDBService();
  List<Map<String, dynamic>> _data = [];

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  Future<void> _fetchData() async {
    try {
      _data = await _harperDBService.fetchData('your_collection'); // 替换为你的集合名称
      setState(() {});
    } catch (e) {
      print(e);
    }
  }

  Future<void> _insertData() async {
    try {
      await _harperDBService.insertData('your_collection', { // 替换为你的集合名称
        'name': 'John Doe',
        'age': 30,
      });
      _fetchData();
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HarperDB Demo'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: _insertData,
            child: Text('Insert Data'),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: _data.length,
              itemBuilder: (context, index) {
                final item = _data[index];
                return ListTile(
                  title: Text('Name: ${item['name']}'),
                  subtitle: Text('Age: ${item['age']}'),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含一个按钮用于插入数据到一个HarperDB集合中,并显示该集合中的所有数据。

请确保你已经替换了示例代码中的baseUrldbapiKeyyour_collection等占位符为你的实际HarperDB实例信息。

这个示例提供了一个基本的框架,你可以根据需要进行扩展,比如添加错误处理、更新数据、删除数据等功能。

回到顶部