Flutter moor: отсутствует libsqlite3.so
Я пишу простое приложение Flutter с Moor; Я создал таблицу, базу данных и dao, но когда я запускаю приложение, оно вылетает с ошибкой,libsqlite3.so
библиотека не найдена.
Это моя база данных
import 'dart:async';
import 'package:moor_ffi/moor_ffi.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'package:moor/moor.dart';
import 'dart:io';
part 'word_database.g.dart';
class Words extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get english => text()();
TextColumn get korean => text()();
}
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'db.sqlite'));
return VmDatabase(file);
});
}
@UseMoor(tables: [Words], daos: [WordDao])
class WordDatabase extends _$WordDatabase {
WordDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
}
@UseDao(tables: [Words])
class WordDao extends DatabaseAccessor<WordDatabase> with _$WordDaoMixin {
final WordDatabase db;
WordDao(this.db) : super(db);
Future<List<Word>> getAllWords() => select(words).get();
Future<List<Word>> getWordById(int id) => (select(words)
..limit(1)
..where((word) => word.id.equals(id)))
.get();
Stream<List<Word>> watchAllWords() => select(words).watch();
Future<int> insertWord(Word word) => into(words).insert(word);
Future updateWord(Word word) => update(words).replace(word);
Future deleteWord(Word word) => delete(words).delete(word);
}
и это моя ошибка
E/flutter (14384): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Invalid argument(s): Failed to load dynamic library (dlopen failed: library "/data/data/com.test.sample/lib/libsqlite3.so" not found)
E/flutter (14384): #0 _open (dart:ffi-patch/ffi_dynamic_library_patch.dart:13:55)
E/flutter (14384): #1 new DynamicLibrary.open (dart:ffi-patch/ffi_dynamic_library_patch.dart:22:12)
E/flutter (14384): #2 _defaultOpen (package:moor_ffi/src/load_library.dart:41:31)
E/flutter (14384): #3 OpenDynamicLibrary.openSqlite (package:moor_ffi/src/load_library.dart:99:12)
E/flutter (14384): #4 new _SQLiteBindings (package:moor_ffi/src/bindings/bindings.dart:121:19)
E/flutter (14384): #5 bindings (package:moor_ffi/src/bindings/bindings.dart:262:53)
E/flutter (14384): #6 new Database.open (package:moor_ffi/src/impl/database.dart:52:9)
E/flutter (14384): #7 new Database.openFile (package:moor_ffi/src/impl/database.dart:37:52)
E/flutter (14384): #8 _VmDelegate.open (package:moor_ffi/src/vm_database.dart:39:22)
E/flutter (14384): #9 DelegatedDatabase.ensureOpen.<anonymous closure> (package:moor/src/runtime/executor/helpers/engines.dart:244:22)
E/flutter (14384): <asynchronous suspension>
E/flutter (14384): #10 DelegatedDatabase.ensureOpen.<anonymous closure> (package:moor/src/runtime/executor/helpers/engines.dart)
E/flutter (14384): #11 BasicLock.synchronized (package:synchronized/src/basic_lock.dart:32:26)
E/flutter (14384): #12 DelegatedDatabase.ensureOpen (package:moor/src/runtime/executor/helpers/engines.dart:238:25)
E/flutter (14384): #13 LazyDatabase.ensureOpen.<anonymous closure> (package:moor/src/utils/lazy_database.dart:43:49)
E/flutter (14384): #14 _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter (14384): #15 _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter (14384): #16 _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter (14384): #17 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter (14384): #18 Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter (14384): #19 Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter (14384): #20 Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:556:7)
E/flutter (14384): #21 _rootRun (dart:async/zone.dart:1184:13)
E/flutter (14384): #22 _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter (14384): #23 _CustomZone.runGuarded (dart:async/zone.dart:979:7)
E/flutter (14384): #24 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1019:23)
E/flutter (14384): #25 _microtaskLoop (dart:async/schedule_microtask.dart:43:21)
E/flutter (14384): #26 _startMicrotaskLoop (dart:async/schedule_microtask.dart:52:5)
E/flutter (14384):
Спасибо за любую помощь.
3 ответа
после долгих исследований моя проблема была решена добавлением
sqlite3_flutter_libs
в pubspec.yaml
Я использую Ubuntu 22.04 LTS и Android-студию Chipmunk. У меня такая же проблема, и я попробовал решение Syahbaz , добавив
sqlite3_flutter_libs
но я получил другую ошибку (работает на окнах). Версия Flutter CMake требует более высокой версии.
CMake Error at flutter/ephemeral/.plugin_symlinks/sqlite3_flutter_libs/linux/CMakeLists.txt:1 (cmake_minimum_required):
CMake 3.14 or higher is required. You are running version 3.10.2
Моя версия Ubuntu cmake
3.20.0
. Да, флаттер использует не Ubuntu CMake, а собственную версию.
3.10.2
.
Затем я устанавливаю
sqlite3
а также
libsqlite3-dev
sudo apt-get install sqlite3 libsqlite3-dev
и это работает, ошибка исчезла, и я могу использовать библиотеку moor для сохранения данных на рабочем столе Ubuntu.
После некоторого исследования выяснилось, что это регресс во Flutter. Для решения нам необходимо обновитьsettings.gradle
.
Ниже представлены исходная (закомментированная) и обновленная версии:
/*
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
*/
include ':app'
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, path ->
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
include ":$name"
project(":$name").projectDir = pluginDirectory
}