Flutter - интеграция SEMBAST со встроенным значением, как вставить модель в сембастную базу данных - PullRequest
0 голосов
/ 14 октября 2019

Я пытался использовать вставку объекта Post в базу данных SEMBAST, но для вставки в БД требуется toMap (). Пожалуйста, найдите мой код ниже


import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

import '../serializers.dart';
import 'articles.dart';

part 'news.g.dart';

abstract class News implements Built<News, NewsBuilder> {
  News._();

  factory News([updates(NewsBuilder b)]) = _$News;

  @BuiltValueField(wireName: 'status')
  String get status;
  @BuiltValueField(wireName: 'totalResults')
  int get totalResults;
  @BuiltValueField(wireName: 'articles')
  BuiltList<Articles> get articles;
  String toJson() {
    return json.encode(serializers.serializeWith(News.serializer, this));
  }

  static News fromJson(String jsonString) {
    return serializers.deserializeWith(
        News.serializer, json.decode(jsonString));
  }

  static Serializer<News> get serializer => _$newsSerializer;


}

и мой файл источника данных

import 'package:boilerplate/data/local/constants/db_constants.dart';
import 'package:boilerplate/models/news/news.dart';
import 'package:boilerplate/models/post/post.dart';
import 'package:boilerplate/models/post/post_list.dart';
import 'package:sembast/sembast.dart';

class NewsDataSource {
  // A Store with int keys and Map<String, dynamic> values.
  final _postsStore = intMapStoreFactory.store(DBConstants.STORE_NAME);

  // Private getter to shorten the amount of code needed to get the
  // singleton instance of an opened database.
//  Future<Database> get _db async => await AppDatabase.instance.database;

  // database instance
  final Future<Database> _db;

  // Constructor
  PostDataSource(this._db);


  // DB functions:--------------------------------------------------------------
  Future insert(News news) async {
    return await _postsStore.add(await _db, post);
  }


}

Но синтаксис вставки await _postsStore.add (await _db, post); показывает ошибку
Future<int> StoreRef.add(DatabaseClient client, Map<String, dynamic> value)

Пожалуйста, помогите мне, как ее решить

1 Ответ

1 голос
/ 15 октября 2019

Как уже говорилось, sembast, как firestore и indexed_db, ожидают карту. Вы должны сериализовать с использованием встроенного значения совместимым способом. Одним из способов является использование StandardJsonPlugin при определении вашего сериализатора:

@SerializersFor([News])
final Serializers serializers =
    (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

Затем вы можете сгенерировать карту из вашего объекта новостей:

var map = serializers.serializeWith(News.serializer, news);

Тогда ваш метод вставки будет выглядеть примерно так:что:

Future insert(News news) async {
  var map = serializers.serializeWith(News.serializer, news);
  return await _postsStore.add(await _db, map);
}
...