制作一个简单的应用程序来实现CRUD操作时遇到Sqflite包问题

问题描述 投票:0回答:1

我正在学习 Flutter。 我创建了一个名为 my_diary_using_sqflite 的 Flutter 应用程序(项目),用于练习 SQLite 数据库中的 CRUD 操作。

但是我被困在 sqflite 包和 sqflite_common_ffi 包和 sqflite_common_ffi_web 包之间。

我在这里展示两个 dart 文件代码,我认为问题出在这两个文件中。

1. note_repository.dart [这是我编写所有CRUD操作函数和数据库相关函数的代码的文件]

import 'package:my_diary_using_sqflite/Models/note.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class NotesRepository {
  static const _dbName = 'notes_database.db';
  static const _tableName = 'notes';

  static Future<Database> database() async {
    return openDatabase(
      join(await getDatabasesPath(), _dbName),
      onCreate: (db, version) {
        return db.execute(
            'CREATE TABLE $_tableName(id INTEGER PRIMARY KEY, title TEXT, description TEXT, createdAt TEXT)');
      },
      version: 1,
    );
    // return databaseFactoryFfi.openDatabase(_dbName);

    // Directory directory = await getApplicationDocumentsDirectory();
    // String path = directory.path + _dbName;
    // return openDatabase(
    //   path,
    //   onCreate: (db, version) {
    //     return db.execute(
    //         'CREATE TABLE $_tableName(id INTEGER PRIMARY KEY, title TEXT, description TEXT, createdAt TEXT)');
    //   },
    //   version: 1,
    // );
  }

  static insert({required Note note}) async {
    print("Finally entering inserted function");
    final db = await database();
    await db.insert(_tableName, note.toMap());
  }

  static Future<List<Note>> getNotes() async {
    final db = await database();
    final List<Map<String, dynamic>> maps = await db.query(
        _tableName); // You can mention other parameters like columns, where, whereArgs, groupBy, having, orderBy, limit, offset

    return List.generate(maps.length, (i) {
      return Note(
          id: maps[i]['id'] as int,
          title: maps[i]['title'] as String,
          description: maps[i]['description'] as String,
          createdAt: DateTime.parse(maps[i]['createdAt']));
    });
  }
}

当我在 Windows (Chrome) 中运行应用程序时,进入添加新注释屏幕后,当我通过输入标题和描述填写表单后单击提交复选标记图标时,错误为

  • 错误:错误状态:databaseFactory 未初始化 仅当使用 sqflite 时才初始化 databaseFactory。使用时
    sqflite_common_ffi

    在使用全局 openDatabase API 之前必须调用
    databaseFactory = databaseFactoryFfi;
    *

说我使用的是sqflite_common_ffi,但实际上我使用的是sqflite

我的 pubspec.yaml 文件代码

dependencies:
  
  flutter:
    sdk: flutter
    
  cupertino_icons: ^1.0.2
  sqflite: ^2.3.3
  intl: ^0.19.0
  path_provider: ^2.1.3
  sqflite_common_ffi: ^2.3.3
  sqflite_common_ffi_web: ^0.4.3+1

这里,错误一一出现后添加了额外的依赖项..

在databaseFactory的sqflite_common_ffi出现第一个错误之后,我对我的 2. main.dart 文件,即

import 'package:flutter/material.dart';
import 'package:my_diary_using_sqflite/Screens/home_screen.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  sqfliteFfiInit();
  databaseFactory = databaseFactoryFfi;
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: "My Diary",
        home: Home_Screen());
  }
}

然后我觉得现在它对我有用。但我再次运行该应用程序,这次只有白屏并出现错误:

拒绝承诺并出现错误:不支持的操作:网络上不支持,请使用 sqflite_common_ffi_web

这就是为什么,我决定添加 sqflite_common_ffi_web 依赖项,但并没有摆脱这个错误。 问题可能与路径相关,但请告诉我实际问题是什么?以及如何解决。这就是为什么我可以成功执行CRUD操作。 :)

flutter sqlite crud sqflite
1个回答
0
投票

对于糟糕的文档感到抱歉。在网络上,您需要按照此处的步骤操作:https://pub.dev/packages/sqflite_common_ffi_web#setup

构建 JavaScript 二进制文件:

dart run sqflite_common_ffi_web:setup

启动时设置正确的数据库工厂:

import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart';

Future<void> main() async {
  // Use sqflite on MacOS/iOS/Android.
  WidgetsFlutterBinding.ensureInitialized();
  if (kIsWeb) {
    // Use web implementation on the web.
    databaseFactory = databaseFactoryFfiWeb;
  } else {
    // Use ffi on Linux and Windows.
    if (Platform.isLinux || Platform.isWindows) {
      databaseFactory = databaseFactoryFfi;
      sqfliteFfiInit();
    }
  }
  var db = await openDatabase(inMemoryDatabasePath);
  print((await db.rawQuery('SELECT sqlite_version()')).first.values.first);
  await db.close();
}
© www.soinside.com 2019 - 2024. All rights reserved.