Здравейте всички. Това е друга история от нашия редовен сегмент „тестване на очевидни неща във вторник“. И този път темата за избор на база данни за локално съхранение на данни във Flutter приложение привлече вниманието ми. Тази тема е много използвана и има много статии, написани за нея, повечето от които засягат само практическото сравнение на три алтернативни опции за съхранение на данни: Hive, SQLite и SharedPreferences.

Няма да ви губя времето да описвам всеки от тях, тъй като ако четете тази статия, вероятно вече знаете какво представляват. И ще сравня само Hive и SQLite, защото не мога да считам SharedPreferences за база данни (можете да ме замерите с лимони, вече си налях малко текила🤙).

И така, как изглежда средната статия за избора на база данни?

Здравейте. Използвайте Hive, не използвайте SQLite. Довиждане.

И за да оправдаем това, е представена такава интересна инфографика:

Всъщност изглежда тъжно, защото всеки, който дори е виждал как се изгражда истински бекенд за възрастни, няма да сравни MongoDB и PostgreSQL само по производителност. Сериозно, защо да заблуждавате наивни начинаещи, които искат да правят мобилни приложения?

Разбира се, нека отложим заключенията до края на статията. Ще видите всичко сами.

Като начало, нека създадем файл, наречен my_class.dart, където ще опишем тестов обект за четене/запис от базата данни. В крайна сметка искаме да тестваме реално използване, а не само цели числа и низове, както на екранните снимки по-горе, точно ?

import 'package:hive/hive.dart';

class MyClass {
  int id;
  String name;

  MyClass(this.id, this.name);
}

class MyClassAdapter extends TypeAdapter<MyClass> {
  @override
  final typeId = 0;

  @override
  MyClass read(BinaryReader reader) {
    final id = reader.readInt();
    final name = reader.readString();
    return MyClass(id, name);
  }

  @override
  void write(BinaryWriter writer, MyClass obj) {
    writer.writeInt(obj.id);
    writer.writeString(obj.name);
  }
}

След това, както обикновено, нека създадем _test файл:

import 'package:flutter/widgets.dart';
import 'package:benchmarking/benchmarking.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:math';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';

import 'my_class.dart';

void main() async {
  // Initialize Hive
  WidgetsFlutterBinding.ensureInitialized();
  Hive.init('.');

  // Register adapter if necessary
  Hive.registerAdapter(MyClassAdapter());

  // Generate test data
  final testData = List.generate(1000, (index) => MyClass(index, 'test'));

  // Benchmark SQLite
  databaseFactory = databaseFactoryFfi;
  final db = await openDatabase('test.db', version: 1, onCreate: (Database db, int version) async {
    await db.execute('CREATE TABLE Test (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)');
  });
  syncBenchmark('SQLite Insert', () async {
    for (int i = 0; i < testData.length; i++) {
      await db.insert('Test', {'id': testData[i].id, 'name': testData[i].name});
    }
  }).report();

  syncBenchmark('SQLite Select', () async {
    await db.rawQuery('SELECT * FROM Test');
  }).report();

// Benchmark Hive
  syncBenchmark('Hive Insert', () async {
    final box = await Hive.openBox<MyClass>('benchmark');
    for (int i = 0; i < testData.length; i++) {
      await box.put(i, testData[i]);
    }
  }).report();

  syncBenchmark('Hive Select', () async {
    final box = await Hive.openBox<MyClass>('benchmark');
    box.values.toList();
  }).report();

  // Clean up
  db.close();
  Hive.deleteBoxFromDisk('benchmark');
}

В нашия експеримент създадохме 1000 обекта от класа MyClass с произволни стойности и след това извършихме вмъкване и селекция на данни в SQLite и Hive.

И така, нека видим резултата:

За да ви улесня да видите, ще преведа резултатите във формат на графика:

Добре, имам един въпрос.

Сериозно

Въпреки че Hive показа по-добра производителност в този бенчмарк, разликата в производителността между Hive и SQLite не е достатъчно значителна, за да напишем статия за Hive в религиозна лудост.

Основното предимство на Hive е неговата лекота на използване. Hive позволява бързо създаване и използване на обекти. Това може да бъде особено полезно за приложения, които не изискват голямо количество данни и изискват бърза реакция при въвеждане от потребителя.

От друга страна, SQLite е по-мощен инструмент за управление на данни, особено за мащабни проекти с голямо количество данни. SQLite може да предостави много опции за управление на данни, като например ограничения за интегритет, тригери и др.

По този начин, когато избирате между Hive и SQLite, е необходимо да вземете предвид изискванията на приложението и обема данни, които трябва да бъдат обработени. Ако е необходимо бързо и просто решение за малки количества данни, тогава Hive е по-добрият избор. Ако проектът е мащабен, изисква по-разширено управление на данни и включва големи количества данни, тогава SQLite е по-добрият избор.

Може да се интересувате и от другите ми показатели:







Технически персонал:



Или цяла поредица от статии за работа с REST API (това е истински лайнокато Санта Барбара):