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
更多关于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集合中,并显示该集合中的所有数据。
请确保你已经替换了示例代码中的baseUrl
、db
、apiKey
和your_collection
等占位符为你的实际HarperDB实例信息。
这个示例提供了一个基本的框架,你可以根据需要进行扩展,比如添加错误处理、更新数据、删除数据等功能。