我正在学习 Flutter。 我创建了一个名为 my_diary_using_sqflite 的 Flutter 应用程序(项目),用于练习 SQLite 数据库中的 CRUD 操作。
但是我被困在 sqflite 包和 sqflite_common_ffi 包和 sqflite_common_ffi_web 包之间。
我在这里展示两个 dart 文件代码,我认为问题出在这两个文件中。
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) 中运行应用程序时,进入添加新注释屏幕后,当我通过输入标题和描述填写表单后单击提交复选标记图标时,错误为
sqflite_common_ffi
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操作。 :)
对于糟糕的文档感到抱歉。在网络上,您需要按照此处的步骤操作: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();
}