Здравейте всички. Това е друга история от нашия редовен сегмент „тестване на очевидни неща във вторник“. И този път темата за избор на база данни за локално съхранение на данни във 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 (това е истински лайнокато Санта Барбара):