feat: add web support for drift database
This commit is contained in:
@@ -1,15 +1,13 @@
|
||||
import 'dart:io';
|
||||
// ignore_for_file: unused_import // Часто генерируется при условном импорте
|
||||
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
// import 'package:flutter/material.dart'; // Не требуется напрямую, т.к. Category импортируется
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
// import 'package:rxdart/rxdart.dart'; // Не используется
|
||||
// Условный импорт бэкенда базы данных
|
||||
import 'database_connection/connection.dart'
|
||||
if (dart.library.html) 'database_connection/connection_web.dart'
|
||||
if (dart.library.io) 'database_connection/connection_native.dart';
|
||||
|
||||
// Импортируем модель категории для возвращаемого типа и утилиты
|
||||
import '../models/category.dart';
|
||||
// Удален ненужный импорт: import '../models/transaction_record.dart';
|
||||
import '../utils/category_utils.dart'; // Helper for category details
|
||||
|
||||
// Эта строка указывает Drift сгенерировать файл database.g.dart
|
||||
@@ -30,7 +28,8 @@ class Transactions extends Table {
|
||||
// Аннотация @DriftDatabase указывает Drift сгенерировать код для этой базы данных
|
||||
@DriftDatabase(tables: [Transactions])
|
||||
class AppDatabase extends _$AppDatabase {
|
||||
AppDatabase() : super(_openConnection());
|
||||
// Используем функцию connect() из условного импорта для создания соединения
|
||||
AppDatabase() : super(connect());
|
||||
|
||||
// Версия схемы. Увеличивайте при изменении структуры таблиц.
|
||||
@override
|
||||
@@ -129,17 +128,117 @@ class AppDatabase extends _$AppDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
// Функция для открытия соединения с базой данных
|
||||
LazyDatabase _openConnection() {
|
||||
// Вычисление пути к файлу базы данных в папке документов приложения
|
||||
return LazyDatabase(() async {
|
||||
final dbFolder = await getApplicationDocumentsDirectory();
|
||||
// Создаем файл 'db.sqlite' в этой папке
|
||||
final file = File(p.join(dbFolder.path, 'db.sqlite'));
|
||||
print("Database file path: ${file.path}"); // Логируем путь для отладки
|
||||
// --- Старый способ с _openConnection ---
|
||||
/*
|
||||
import 'dart:io'; // Нужен только для NativeDatabase
|
||||
|
||||
// Используем NativeDatabase для открытия соединения
|
||||
// logStatements: true полезен для отладки SQL-запросов
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart'; // Для NativeDatabase
|
||||
import 'package:drift/web.dart'; // Для WebDatabase
|
||||
import 'package:flutter/foundation.dart'; // Для kIsWeb
|
||||
import 'package:path_provider/path_provider.dart'; // Для NativeDatabase
|
||||
import 'package:path/path.dart' as p; // Для NativeDatabase
|
||||
|
||||
// ... (остальной код database.dart как выше) ...
|
||||
|
||||
// Функция для открытия соединения с базой данных (старый вариант)
|
||||
QueryExecutor _openConnection() {
|
||||
// Вычисление пути к файлу базы данных в папке документов приложения
|
||||
if (kIsWeb) {
|
||||
print("Using WebDatabase (IndexedDB)");
|
||||
// Используем WebDatabase для веба. 'db' - имя базы данных в IndexedDB.
|
||||
// logStatements: true полезен для отладки SQL-запросов (в консоли браузера)
|
||||
return WebDatabase('db', logStatements: false);
|
||||
} else {
|
||||
// Используем NativeDatabase для нативных платформ (Android, iOS, Desktop)
|
||||
return LazyDatabase(() async {
|
||||
final dbFolder = await getApplicationDocumentsDirectory();
|
||||
// Создаем файл 'db.sqlite' в этой папке
|
||||
final file = File(p.join(dbFolder.path, 'db.sqlite'));
|
||||
print("Database file path (Native): ${file.path}"); // Логируем путь для отладки
|
||||
|
||||
// Используем NativeDatabase для открытия соединения
|
||||
// logStatements: true полезен для отладки SQL-запросов
|
||||
return NativeDatabase(file, logStatements: false);
|
||||
});
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// --- Новый способ с условным импортом ---
|
||||
// Создайте 3 новых файла в папке lib/database/database_connection/
|
||||
|
||||
// Файл 1: lib/database/database_connection/connection.dart
|
||||
// Этот файл будет пустым или содержать общие абстракции, если нужно.
|
||||
// Он нужен для указания базового пути для условного импорта.
|
||||
/*
|
||||
// lib/database/database_connection/connection.dart
|
||||
import 'package:drift/drift.dart';
|
||||
|
||||
// Можно оставить пустым или определить общие типы/функции,
|
||||
// но для простого соединения достаточно пустого файла.
|
||||
// Главное, чтобы он существовал для разрешения импорта.
|
||||
|
||||
// Определим функцию-заглушку, чтобы основной файл мог ее импортировать
|
||||
QueryExecutor connect() => throw UnimplementedError('Platform not supported');
|
||||
*/
|
||||
|
||||
// Файл 2: lib/database/database_connection/connection_web.dart
|
||||
/*
|
||||
// lib/database/database_connection/connection_web.dart
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/web.dart';
|
||||
|
||||
QueryExecutor connect() {
|
||||
print("Using WebDatabase (IndexedDB)");
|
||||
// logStatements: true полезен для отладки SQL-запросов (в консоли браузера)
|
||||
return WebDatabase('db', logStatements: false);
|
||||
}
|
||||
*/
|
||||
|
||||
// Файл 3: lib/database/database_connection/connection_native.dart
|
||||
/*
|
||||
// lib/database/database_connection/connection_native.dart
|
||||
import 'dart:io';
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart'; // Импорт для настройки sqlite3
|
||||
import 'package:sqlite3/sqlite3.dart'; // Импорт для настройки sqlite3
|
||||
|
||||
QueryExecutor connect() {
|
||||
// Используем LazyDatabase для отложенной инициализации на нативных платформах
|
||||
return LazyDatabase(() async {
|
||||
// Настройка пути к библиотеке sqlite3 для Windows/Linux
|
||||
// На Android/iOS/macOS это обычно не требуется, так как используется sqlite3_flutter_libs
|
||||
if (Platform.isWindows || Platform.isLinux) {
|
||||
// Эта часть может потребовать адаптации в зависимости от вашей системы сборки
|
||||
// и того, как вы распространяете нативные библиотеки.
|
||||
// Пример: final libraryNextToScript = File('sqlite3.so'); // или .dll
|
||||
// applyWorkaroundToOpenSqlite3Library(library: libraryNextToScript);
|
||||
// Или используйте пакет sqlite3_flutter_libs, который пытается сделать это автоматически
|
||||
}
|
||||
// Настройка для FFI (может быть не нужна с последними версиями drift/sqlite3_flutter_libs)
|
||||
// sqlite3.open.overrideFor(OperatingSystem.windows, openSqliteOnWindows); // Пример для Windows
|
||||
|
||||
final dbFolder = await getApplicationDocumentsDirectory();
|
||||
final file = File(p.join(dbFolder.path, 'db.sqlite'));
|
||||
print("Database file path (Native): ${file.path}");
|
||||
|
||||
// Применяем обходной путь для открытия библиотеки sqlite3, если нужно
|
||||
// Это важно для некоторых платформ, особенно Windows/Linux
|
||||
// await applyWorkaroundToOpenSqlite3Library(checkIsolate: false); // Используйте по необходимости
|
||||
|
||||
// Используем NativeDatabase
|
||||
return NativeDatabase(file, logStatements: false);
|
||||
});
|
||||
}
|
||||
|
||||
// Пример функции для Windows (может потребоваться адаптация)
|
||||
// DynamicLibrary openSqliteOnWindows() {
|
||||
// final scriptDir = File(Platform.script.toFilePath()).parent;
|
||||
// final libraryNextToScript = File(p.join(scriptDir.path, 'sqlite3.dll'));
|
||||
// return DynamicLibrary.open(libraryNextToScript.path);
|
||||
// }
|
||||
*/
|
||||
|
||||
@@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
version: 1.0.0+1
|
||||
|
||||
environment:
|
||||
sdk: ^3.7.0
|
||||
sdk: ^3.7.0 # Drift 2.18 requires Dart 3.4+, Drift 2.16 requires Dart 3.3+
|
||||
|
||||
# Dependencies specify other packages that your package needs in order to work.
|
||||
# To automatically upgrade your package dependencies to the latest versions
|
||||
@@ -32,11 +32,12 @@ dependencies:
|
||||
sdk: flutter
|
||||
fl_chart: ^0.71.0
|
||||
intl: ^0.19.0 # For date formatting
|
||||
drift: ^2.26.0 # Added Drift
|
||||
sqlite3_flutter_libs: ^0.5.22 # Recommended for Drift on Flutter
|
||||
path_provider: ^2.1.3 # To find database file location
|
||||
path: ^1.9.0 # To construct database file path
|
||||
rxdart: ^0.28.0 # Added rxdart for combining streams in database
|
||||
drift: ^2.18.0 # Updated Drift
|
||||
drift_web: ^0.1.0 # Added Drift Web support
|
||||
sqlite3_flutter_libs: ^0.5.24 # Needed for native platforms
|
||||
path_provider: ^2.1.3 # To find database file location on native
|
||||
path: ^1.9.0 # To construct database file path on native
|
||||
# rxdart: ^0.28.0 # Removed as it wasn't used in database.dart
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
cupertino_icons: ^1.0.8
|
||||
@@ -44,8 +45,8 @@ dependencies:
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
drift_dev: ^2.18.0 # Added Drift code generator
|
||||
build_runner: ^2.4.11 # Added build_runner
|
||||
drift_dev: ^2.18.0 # Updated Drift code generator
|
||||
build_runner: ^2.4.11 # Updated build_runner
|
||||
|
||||
# The "flutter_lints" package below contains a set of recommended lints to
|
||||
# encourage good coding practices. The lint set provided by the package is
|
||||
|
||||
Reference in New Issue
Block a user