【问题标题】:Is there a NoSQL alternative to SQLite for flutter?是否有用于 Flutter 的 SQLite 的 NoSQL 替代品?
【发布时间】:2021-05-18 16:26:53
【问题描述】:

我正在构建一个独立的(没有对 MongoDB 或 Firebase 等的 API 调用)flutter 应用程序,其中数据库管理至关重要。目前,我将它存储为 JSON,但它的效率很低。我不能使用 SQLite,因为数据非常嵌套,事实上,JSON 是存储我的数据的唯一方法。所以,我正在寻找 NoSQL 替代方案。

这是我要存储的数据模型。

lib/book_model.dart


@JsonSerializable()
class Book {
  /// Do not change this. It's a primary key.
  String bookLink;
  String authors = null;
  String thumbnail = null;
  String bookName = null;

  List<Chapter> totalChaptersList = [];

  ///todo: determine datatype
  var currentChapter;

  String summary = null;

  double rating = 0.0;

  List<String> genres = [];
  Book({
    this.bookLink,
    this.authors,
    this.thumbnail,
    this.bookName,
    this.totalChaptersList,
    this.currentChapter,
    this.summary,
    this.rating,
    this.genres,
  });

  Book.generateFromSearchBook(SearchBook searchBook) {
    this.authors = searchBook.authors;
    this.bookLink = searchBook.bookLink;
    this.bookName = searchBook.bookName;
    this.thumbnail = searchBook.thumbnail;
  }

  // @override
  // String toString() {
  //   return "<$bookLink , $authors , $thumbnail , $bookName , $summary , $genres , $rating , $totalChaptersList , $currentChapter>";
  // }

  factory Book.fromJson(Map<String, dynamic> json) => _$BookFromJson(json);
  Map<String, dynamic> toJson() => _$BookToJson(this);
}

@JsonSerializable()
class Chapter {
  String name = null;
  String date = null;
  String chapterLink = null;

  @JsonKey(defaultValue: false)
  bool has_read = false;

  List<Page> pages = [];
  
  Chapter({
    this.name,
    this.date,
    this.chapterLink,
    this.has_read,
    this.pages,
  });

  // @override
  // String toString() {
  //   return "<$name , $date , $chapterLink , $has_read , $pages>";
  // }

  factory Chapter.fromJson(Map<String, dynamic> json) => _$ChapterFromJson(json);
  Map<String, dynamic> toJson() => _$ChapterToJson(this);
}

@JsonSerializable()
class Page {
  String pageLink = null;
  int pageNumber = 0;
  Page({
    this.pageLink,
    this.pageNumber,
  });

  // @override
  // String toString() {
  //   return "<$pageLink , $pageNumber>";
  // }
  factory Page.fromJson(Map<String, dynamic> json) => _$PageFromJson(json);
  Map<String, dynamic> toJson() => _$PageToJson(this);
}

【问题讨论】:

  • 这适合您的用例 Hive - pub.dev/packages/hive 吗?
  • 如果数据是嵌套的,你只能使用 MongoDB 或 firebase 的任何数据库,否则你将不得不使用 JSON,但如果数据变大,你肯定会受到内存的影响泄漏,也许那时可能必须找到一种方法来拆分数据。
  • 最近我遇到了同样的问题;我仍然没有找到像 Mongo 这样可以替代 Sqlite 的 NoSQL 数据库。

标签: sqlite flutter nosql


【解决方案1】:

我找到了这两个

  • Hive - Hive 是一个用纯 Dart 编写的轻量级且速度极快的键值对数据库。受到 Bitcask 的启发。
  • ObjectBox - ObjectBox 是一个在本地存储 Dart 对象的超快速数据库。

【讨论】:

    【解决方案2】:

    我使用Hive。它快速且易于使用。您可以将 hive_generatorjson_serializablefreezed 一起使用来创建 HiveObject 类。

    示例:

    @HiveType(typeId: 0)
    class Person extends HiveObject {
      @HiveField(0)
      String name;
            
      @HiveField(1)
      int age;
    }
    

    您还可以使用hive_box 将您的蜂巢盒变成可监听的并监听数据库更改。

    示例:

    import 'package:hive/hive.dart';
    import 'package:hive_flutter/hive_flutter.dart';
    
    class SettingsPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return ValueListenableBuilder(
          valueListenable: Hive.box('settings').listenable(),
          builder: (context, box, widget) {
            return Switch(
              value: box.get('darkMode'),
              onChanged: (val) {
                box.put('darkMode', val);
              }
            );
          },
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2011-06-20
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2013-01-29
      相关资源
      最近更新 更多