Sqlite с Flutter Desktop Windows?
приложение работает с Android, но не работает с рабочим столом
[ОШИБКА: flutter / lib / ui / ui_dart_state.cc(186)] Необработанное исключение: MissingPluginException (Нет реализации для метода getDatabasesPath на канале com.tekartik.sqflite)
4 ответа
Как указано в комментарии
sqflite_common_ffi
позволяет использовать sqflite API на рабочем столе. Он не реализован как плагин флаттера, так как он также работает в обычной виртуальной машине дротика.
Вы можете прочитать это , чтобы узнать, как использовать существующий код sqflite на рабочем столе. Но поскольку всегда лучше объяснить немного больше, чем добавить ссылку, вот основные шаги:
Настраивать
Сначала добавьте зависимость:
dependencies:
sqflite_common_ffi:
Инициализация
Затем инициализируйте ffi перед запуском приложения:
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqflite/sqflite.dart';
Future main() async {
if (Platform.isWindows || Platform.isLinux) {
// Initialize FFI
sqfliteFfiInit();
// Change the default factory
databaseFactory = databaseFactoryFfi;
}
runApp(MyApp());
}
В настоящее время
sqflite
поддерживает только Android Ios и Mac. В качестве альтернативы вы можете использовать Hive или sembast.
Если вы хотите выполнять запросы к базе данных, я предлагаю вам использовать sembast.
оба пакета в настоящее время поддерживают всю платформу, однако, если вы используете sembast, вы должны включить пакет
sembast_web
для веб-поддержки.
Пакеты:
Hive
: https://pub.dev/packages/hive
Sembast
: https://pub.dev/packages/sembast
Sembast_web
: https://pub.dev/packages/sembast_web
SQFlite в Windows
flutter pub add sqflite_common_ffi
Шаг 1
Не забудьте загрузить двоичный файл Windows. Загрузите файл SQLite DDL.
Путь
Добавьте файл DLL по этому пути.
Код
class SQFLite {
Database? _database;
Future<Database> get database async {
if (_database != null) {
return _database!;
}
_database = await initWinDB();
return _database!;
}
Future<Database> initWinDB() async {
sqfliteFfiInit();
final databaseFactory = databaseFactoryFfi;
return await databaseFactory.openDatabase(
inMemoryDatabasePath,
options: OpenDatabaseOptions(
onCreate: _onCreate,
version: 1,
),
);
}
// based on what type of data you want to add your Table
Future<void> _onCreate(Database database, int version) async {
final db = database;
await db.execute(""" CREATE TABLE IF NOT EXISTS users(
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT,
password INTEGER,
phoneNumber INTEGER
)
""");
}
}
Инициализация
Либо вы можете написать это в основной функции, либо, если вы работаете над отдельным файлом, вы можете добавить его внутри initState().
void initState() {
super.initState();
WidgetsFlutterBinding.ensureInitialized();
helper.initWinDB();
}
Код Гитхаба
Как отметил @alextk, вы можете использовать sqflite_common_ffi , чтобы получить желаемую поддержку Windows. Однако, в зависимости от ваших требований, вариант с чистым Dart может быть лучшей альтернативой.
Если вы просто хотите хранить пары ключ/значение, вероятно, лучше всего подойдет Hive , но если вы хотите хранить объекты,ObjectBox, вероятно, будет лучшим выбором.
Вот хорошая статья, которая содержит сравнение существующих технологий хранения для Flutter:
https://objectbox.io/flutter-databases-sqflite-hive-objectbox-and-moor/