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 по этому пути.sqlpath

Код

      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/

Другие вопросы по тегам