Flutter数据库操作辅助插件amplify_db_common_dart的使用

Flutter数据库操作辅助插件amplify_db_common_dart的使用

amplify_db_common_dart

amplify_db_common_dart 提供了用于处理数据库(如sqlite)的通用工具。

Drift数据库连接

connect() 函数在web或vm平台上创建一个QueryExecutor。

使用于Web

Web实现使用package:drift/wasm.dart。要在web应用(如flutter web,非flutter web)中使用此工具,需要手动包含sqlite3.wasm文件。有关更多信息,请参阅drift wasm文档

在Flutter VM中使用

此工具不依赖于Flutter,并且可以在非Flutter应用和包中使用。要在Flutter应用或包中使用此包,需要将amplify_db_common作为依赖项添加。更多详情请参见其pub.dev页面

示例代码

以下是一个简单的示例,展示了如何使用amplify_db_common_dart插件进行数据库操作。

import 'package:amplify_db_common_dart/amplify_db_common_dart.dart';
import 'package:drift/drift.dart';

// 定义数据模型
class Note extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get content => text().named('note_content')();
}

// 创建数据库连接
Future<void> main() async {
  // 初始化数据库连接
  final executor = await connect();

  // 创建数据库实例
  final db = MyDatabase(executor);

  // 插入数据
  await db.into(db.note).insert(NoteCompanion(content: Value('Hello World')));

  // 查询数据
  final notes = await db.select(db.note).get();

  // 打印查询结果
  notes.forEach((note) {
    print('Note ID: ${note.id}, Content: ${note.content}');
  });
}

// 定义数据库类
class MyDatabase extends Database {
  MyDatabase(QueryExecutor queryExecutor) : super(queryExecutor);

  static final Schema schema = Schema([
    Note(),
  ]);

  [@override](/user/override)
  QueryExecutor getSchemaExecutor() {
    return schema;
  }
}

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

1 回复

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


当然,amplify_db_common_dart 是 Amplify 框架的一部分,它主要用于与 Amplify DataStore 交互,提供了一组通用的数据操作功能,尤其是在处理 Flutter 应用中的数据库操作时。虽然 amplify_db_common_dart 本身主要是作为底层库被其他 Amplify 库(如 amplify_datastore)所依赖,但你可以通过 amplify_datastore 来间接使用其功能。

以下是一个使用 Amplify DataStore 和 GraphQL API 的 Flutter 应用示例,展示了如何进行基本的数据库操作(创建、读取、更新和删除)。这个示例假设你已经配置好了 Amplify 项目并添加了 DataStore 和 GraphQL API。

1. 配置 Amplify 项目

首先,确保你已经使用 Amplify CLI 配置了你的项目并添加了 DataStore 和 GraphQL API。

amplify configure
amplify add api
amplify push

2. 安装 Flutter Amplify 包

在你的 Flutter 项目中,添加 Amplify 相关的依赖项到你的 pubspec.yaml 文件:

dependencies:
  flutter:
    sdk: flutter
  amplify_flutter: ^0.x.y  # 请替换为最新版本
  amplify_datastore: ^0.x.y  # 请替换为最新版本

3. 初始化 Amplify

在你的 Flutter 应用中,初始化 Amplify:

import 'package:amplify_flutter/amplify.dart';
import 'package:amplify_datastore/amplify_datastore.dart';
import 'amplifyconfiguration.dart'; // 你需要从 amplify-cli 生成的配置文件

Future<void> configureAmplify() async {
  try {
    await Amplify.addPlugins([
      AmplifyAPI(),
      AmplifyAuthCognito(),
      AmplifyDataStore(),
    ]);
    await Amplify.configure(amplifyconfig);
    print('Amplify configured successfully');
  } catch (e) {
    print('Could not configure Amplify: $e');
  }
}

4. 定义你的 GraphQL 模型

假设你有一个名为 Todo 的模型,你的 schema.graphql 可能看起来像这样:

type Todo @model {
  id: ID!
  name: String!
  description: String
  completed: Boolean!
}

5. 使用 DataStore 进行数据库操作

以下是如何使用 DataStore 进行基本的 CRUD 操作:

import 'package:flutter/material.dart';
import 'package:amplify_datastore/amplify_datastore.dart';
import 'package:amplify_flutter/amplify.dart';
import 'models/AmplifyModels/Todo.dart'; // 由 Amplify CLI 自动生成

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await configureAmplify();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Amplify DataStore Example'),
        ),
        body: TodoListScreen(),
      ),
    );
  }
}

class TodoListScreen extends StatefulWidget {
  @override
  _TodoListScreenState createState() => _TodoListScreenState();
}

class _TodoListScreenState extends State<TodoListScreen> {
  List<Todo> todos = [];

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

  Future<void> loadTodos() async {
    todos = await Amplify.DataStore.query(Todo.classType);
    setState(() {});
  }

  Future<void> addTodo(String name, bool completed) async {
    final todo = Todo(name: name, completed: completed);
    await Amplify.DataStore.save(todo);
    loadTodos();
  }

  Future<void> updateTodo(String id, bool completed) async {
    final todo = await Amplify.DataStore.query(
      Todo.classType,
      where: Todo.ID.eq(id),
    );
    todo?.completed = completed;
    await Amplify.DataStore.save(todo!);
    loadTodos();
  }

  Future<void> deleteTodo(String id) async {
    final todo = await Amplify.DataStore.query(
      Todo.classType,
      where: Todo.ID.eq(id),
    );
    await Amplify.DataStore.delete(todo!);
    loadTodos();
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          TextField(
            decoration: InputDecoration(labelText: 'Todo Name'),
            onEditingComplete: () async {
              final controller = TextEditingController.fromValue(
                TextField.getTextEditingController(context).value,
              );
              addTodo(controller.text, false);
              controller.clear();
              TextField.getTextEditingController(context).value =
                  controller.value;
            },
          ),
          SizedBox(height: 16),
          Expanded(
            child: ListView.builder(
              itemCount: todos.length,
              itemBuilder: (context, index) {
                final todo = todos[index];
                return ListTile(
                  title: Text(todo.name),
                  trailing: Checkbox(
                    value: todo.completed,
                    onChanged: (newValue) async {
                      updateTodo(todo.id, newValue!);
                    },
                  ),
                  onTap: () async {
                    await deleteTodo(todo.id);
                  },
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们展示了如何:

  1. 配置 Amplify。
  2. 使用 DataStore 进行查询 (query)、保存 (save) 和删除 (delete) 操作。
  3. 在 Flutter UI 中展示和更新待办事项列表。

请确保你已经运行了 amplify push 并且由 Amplify CLI 生成了相应的模型文件 (Todo.dart)。这样,你就可以在 Flutter 应用中使用这些模型进行数据库操作了。

回到顶部