Android 如何使用Moor_Flutter从数据库中获取单个值
我有一个设置页面,它使用一个非常简单的数据库,它由两个表组成,可以改变谷歌地图的外观。还有一个表,但它用于应用程序中的其他内容,我这里不关心它。我正在为此使用moor_颤振和提供程序包,但返回值有点困难 在这种情况下,我想做的是检索一个布尔值并相应地显示SwitchListTile,但不幸的是,我无法得到这个错误 NoSuchMethodError:类“List”没有实例获取程序“tilt”。 Receiver:Instancelength:0(属于“\u GrowtableList”)尝试呼叫:tilt。 另见: 任何帮助都将不胜感激 这是我的表格配置Android 如何使用Moor_Flutter从数据库中获取单个值,android,database,flutter,dart,flutter-moor,Android,Database,Flutter,Dart,Flutter Moor,我有一个设置页面,它使用一个非常简单的数据库,它由两个表组成,可以改变谷歌地图的外观。还有一个表,但它用于应用程序中的其他内容,我这里不关心它。我正在为此使用moor_颤振和提供程序包,但返回值有点困难 在这种情况下,我想做的是检索一个布尔值并相应地显示SwitchListTile,但不幸的是,我无法得到这个错误 NoSuchMethodError:类“List”没有实例获取程序“tilt”。 Receiver:Instancelength:0(属于“\u GrowtableList”)尝试呼叫
// Map Parameters table definition
class Parameters extends Table {
BoolColumn get tilt => boolean().withDefault(Constant(true))();
BoolColumn get traffic => boolean().withDefault(Constant(false))();
BoolColumn get compass => boolean().withDefault(Constant(true))();
BoolColumn get rotate => boolean().withDefault(Constant(true))();
BoolColumn get zoom => boolean().withDefault(Constant(true))();
/*TextColumn get type => text().named('normal')();
TextColumn get area => text().named('Uni Campus')();*/
}
这是我的AppDatabase类
// App Database Class
@UseMoor(
tables: [Parameters, Themes, Places],
daos: [ParameterDao, ThemeDao, PlaceDao])
class AppDatabase extends _$AppDatabase {
AppDatabase()
: super(FlutterQueryExecutor.inDatabaseFolder(
path: 'db.sqlite', logStatements: true));
// Database Schema Version
@override
int get schemaVersion => 1; // Change this with every DB change
@override
MigrationStrategy get migration => MigrationStrategy(
onUpgrade: (migrator, from, to) async{
if(from == 1){
// await migrator.addColumn(<table, <table>.<fieldName>);
// await migrator.createTable(<table>);
}
},
/*beforeOpen: (db,details) async {
await db.customStatement('PRAGMA foreign_keys = ON');
}*/
);
}
这是bool_allowTilt=snapshot.data.tilt;导致错误的行
因为看起来您正试图访问snapshot.data上的属性,但数据应该是符合DAO的列表
DAO返回一个流,以便将数据解包到列表中
如果表中只有一个条目,则可以通过调用列表中的第一个条目来访问该条目,或者在DAO中调用watchSingle,这样,如果表中有多个条目,则只有一个条目将引发异常。或者你必须在数据上循环
顺便说一下,数据可以为空,在访问数据之前检查snapshot.hasData是否为空是一个好主意。是,这是导致错误的那一行。如果我硬编码一个值,比如bool _AllowTilt=true,那么一切都很好。我将检查快照是否有数据,但即使有默认值,数据也可以为null吗?我认为我已经正确地添加了默认值。谢谢lyio-我很感谢你的时间。
@UseDao(tables: [Parameters])
class ParameterDao extends DatabaseAccessor<AppDatabase> with _$ParameterDaoMixin {
final AppDatabase db;
ParameterDao(this.db) : super(db);
// Map parameters queries
Future<List<Parameter>> getAllParameters() => select(parameters).get();
Stream<List<Parameter>> watchAllParameters() => select(parameters).watch();
Future updateParameter(Parameter parameter, {bool tilt}) =>
update(parameters).replace(parameter);
}
@override
Widget build(BuildContext context) {
final dao = Provider.of<ParameterDao>(context);
return StreamBuilder(
stream: dao.watchAllParameters(),
builder: (context, AsyncSnapshot snapshot) {
bool _allowTilt = snapshot.data.tilt;
bool _enableRotate = true;
bool _enableZoom = true;
bool _showTraffic = false;
bool _showCompass = true;
return Container(
child: DecoratedBox(
decoration: BoxDecoration(
...
...
...
SwitchListTile(
value: _allowTilt,
onChanged: (value) {
setState(() {
// _allowTilt = value;
//_db.updateParameter(tilt: _allowTilt);
//print("ALLOW TILT => _allowTilt");
});
},
title: Text(
AppLocalizations.of(context).settingsLabelTilt),
activeColor: Theme.UniColour.primary[900],
),