创新实训可视化展示篇2——《数据库设计与持久化管理》

引言

在开发现代应用程序时,数据库设计与数据持久化是非常重要的环节。良好的数据库设计可以有效地管理和组织数据,提高应用的性能和可维护性。本文将详细介绍如何为Flutter应用设计数据库,特别是涉及人物、关系、朝代、地点和诗词等数据表的设计,并探讨如何实现数据的持久化管理。

数据库选择与SQLite介绍

在移动应用开发中,SQLite是一种非常流行的轻量级关系型数据库,它嵌入式的特点使其特别适合在移动设备上使用。SQLite具有以下优点:

  • 轻量级:无需单独的服务器进程,嵌入式的特性使其非常适合移动应用。

  • ACID特性:确保数据的原子性、一致性、隔离性和持久性。

  • 广泛支持:几乎所有的移动平台和编程语言都支持SQLite。

数据库表的设计

在设计数据库表时,我们需要考虑应用的需求和数据的关联性。在本应用中,我们需要管理以下几类数据:

  • 人物(Person)

  • 关系(Relationship)

  • 朝代(Dynasty)

  • 地点(Place)

  • 诗词(Poem)

1. 人物(Person)表设计

人物表用于存储人物的基本信息,如姓名、字、号、出生日期、职业、作品、时代、籍贯和描述。

CREATE TABLE Person (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  courtesyName TEXT,
  pseudonym TEXT,
  birthday TEXT,
  occupation TEXT,
  works TEXT,
  era TEXT,
  nativePlace TEXT,
  description TEXT
);
2. 关系(Relationship)表设计

关系表用于存储人物之间的关系信息,包括起始节点、目标节点和关系类型。

CREATE TABLE Relationship (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  fromNode TEXT NOT NULL,
  toNode TEXT NOT NULL,
  relation TEXT NOT NULL
);
3. 朝代(Dynasty)表设计

朝代表用于存储朝代的基本信息,如名称、时期和描述。

CREATE TABLE Dynasty (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  period TEXT NOT NULL,
  description TEXT
);
4. 地点(Place)表设计

地点表用于存储地点的基本信息,如名称、城市和描述。

CREATE TABLE Place (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  city TEXT,
  description TEXT
);
5. 诗词(Poem)表设计

诗词表用于存储诗词的基本信息,如标题、作者、时代、创作背景和诗句。

CREATE TABLE Poem (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  title TEXT NOT NULL,
  author TEXT NOT NULL,
  era TEXT,
  creationBackground TEXT,
  verses TEXT NOT NULL
);
数据库的持久化管理

为了在Flutter应用中管理SQLite数据库,我们可以使用sqflite插件。sqflite插件提供了对SQLite数据库的完整支持,使得Flutter应用能够方便地执行数据库操作。

1. 添加依赖

pubspec.yaml文件中添加sqflitepath依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  path: ^1.8.0

运行flutter pub get命令以获取依赖。

2. 创建数据库助手类

我们可以创建一个数据库助手类来封装所有的数据库操作,如创建表、插入数据、查询数据等。以下是一个示例数据库助手类:

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
​
class DatabaseHelper {
  static final DatabaseHelper instance = DatabaseHelper._instance();
  static Database? _database;
​
  DatabaseHelper._instance();
​
  String personTable = 'person';
  String relationshipTable = 'relationship';
  String dynastyTable = 'dynasty';
  String placeTable = 'place';
  String poemTable = 'poem';
​
  // Person Table
  String colId = 'id';
  String colName = 'name';
  String colCourtesyName = 'courtesyName';
  String colPseudonym = 'pseudonym';
  String colBirthday = 'birthday';
  String colOccupation = 'occupation';
  String colWorks = 'works';
  String colEra = 'era';
  String colNativePlace = 'nativePlace';
  String colDescription = 'description';
​
  // Relationship Table
  String colFromNode = 'fromNode';
  String colToNode = 'toNode';
  String colRelation = 'relation';
​
  // Dynasty Table
  String colPeriod = 'period';
​
  // Place Table
  String colCity = 'city';
​
  // Poem Table
  String colTitle = 'title';
  String colAuthor = 'author';
  String colCreationBackground = 'creationBackground';
  String colVerses = 'verses';
​
  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDb();
    return _database!;
  }
​
  Future<Database> _initDb() async {
    String dbPath = await getDatabasesPath();
    String path = join(dbPath, 'app_database.db');
    return await openDatabase(path, version: 1, onCreate: _createDb);
  }
​
  void _createDb(Database db, int version) async {
    await db.execute('''
      CREATE TABLE $personTable (
        $colId INTEGER PRIMARY KEY AUTOINCREMENT,
        $colName TEXT NOT NULL,
        $colCourtesyName TEXT,
        $colPseudonym TEXT,
        $colBirthday TEXT,
        $colOccupation TEXT,
        $colWorks TEXT,
        $colEra TEXT,
        $colNativePlace TEXT,
        $colDescription TEXT
      )
    ''');
​
    await db.execute('''
      CREATE TABLE $relationshipTable (
        $colId INTEGER PRIMARY KEY AUTOINCREMENT,
        $colFromNode TEXT NOT NULL,
        $colToNode TEXT NOT NULL,
        $colRelation TEXT NOT NULL
      )
    ''');
​
    await db.execute('''
      CREATE TABLE $dynastyTable (
        $colId INTEGER PRIMARY KEY AUTOINCREMENT,
        $colName TEXT NOT NULL,
        $colPeriod TEXT NOT NULL,
        $colDescription TEXT
      )
    ''');
​
    await db.execute('''
      CREATE TABLE $placeTable (
        $colId INTEGER PRIMARY KEY AUTOINCREMENT,
        $colName TEXT NOT NULL,
        $colCity TEXT,
        $colDescription TEXT
      )
    ''');
​
    await db.execute('''
      CREATE TABLE $poemTable (
        $colId INTEGER PRIMARY KEY AUTOINCREMENT,
        $colTitle TEXT NOT NULL,
        $colAuthor TEXT NOT NULL,
        $colEra TEXT,
        $colCreationBackground TEXT,
        $colVerses TEXT NOT NULL
      )
    ''');
  }
​
  // CRUD operations for each table
  Future<int> insertPerson(Map<String, dynamic> row) async {
    Database db = await instance.database;
    return await db.insert(personTable, row);
  }
​
  Future<int> updatePerson(Map<String, dynamic> row) async {
    Database db = await instance.database;
    int id = row[colId];
    return await db.update(personTable, row, where: '$colId = ?', whereArgs: [id]);
  }
​
  Future<int> deletePerson(int id) async {
    Database db = await instance.database;
    return await db.delete(personTable, where: '$colId = ?', whereArgs: [id]);
  }
​
  Future<List<Map<String, dynamic>>> getPeople() async {
    Database db = await instance.database;
    return await db.query(personTable);
  }
​
  // Repeat for other tables...
}
3. 数据表操作示例

以下是一些基本的数据库操作示例,包括插入、更新、删除和查询。

// 插入数据
Future<void> insertPerson() async {
  Map<String, dynamic> person = {
    'name': '李白',
    'courtesyName': '太白',
    'pseudonym': '青莲居士',
    'birthday': '701-02-28',
    'occupation': '诗人',
    'works': '将进酒',
    'era': '唐代',
    'nativePlace': '四川',
    'description': '中国唐代伟大的浪漫主义诗人'
  };
  await DatabaseHelper.instance.insertPerson(person);
}
​
// 查询数据
Future<void> getPeople() async {
  List<Map<String, dynamic>> people = await DatabaseHelper.instance.getPeople();
  people.forEach((person) {
    print(person);
  });
}
​
// 更新数据
Future<void> updatePerson() async {
  Map<String, dynamic> person = {
    'id': 1,
    'name': '杜甫',
    'courtesyName': '子美',
    'pseudonym': '少陵野老',
    'birthday': '712-02-12',
    'occupation': '诗人',
    'works': '春望',
    'era': '唐代',
    'nativePlace': '
​
河南',
    'description': '中国唐代现实主义诗人'
  };
  await DatabaseHelper.instance.updatePerson(person);
}
​
// 删除数据
Future<void> deletePerson(int id) async {
  await DatabaseHelper.instance.deletePerson(id);
}
结论

通过本文,我们详细介绍了应用中使用的数据库设计,包括人物、关系、朝代、地点和诗词等数据表的设计,以及如何实现数据的持久化管理。通过使用sqflite插件,我们能够方便地在Flutter应用中管理SQLite数据库,实现数据的增删改查操作。在后续的博客中,我们将进一步探讨如何在应用中展示和编辑这些数据。希望通过本系列博客,帮助读者全面掌握Flutter应用开发中的数据库设计与持久化管理技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值