Flutter我放了一个DB或动态复选框,但我得到了一个只读错误



我想在Flutter中提取数据库,并用动态复选框列出它,但我遇到了一个错误。模拟器上出现错误,错误消息为"不支持的操作:只读"。在控制台上,我收到错误消息"以下UnsupportedError被抛出,正在构建FutureBuilder<列表<映射<动态的,动态的>gt>(脏,状态:_FutureBuilderState<List<Map<dynamic>>#433fa(:不支持的操作:只读"。

DB已经这样存储了。

void saveData() async {
String path = join(await getDatabasesPath(), "dbname.db");
Database database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute(
"CREATE TABLE tablename(id INTEGER PRIMARY KEY, test TEXT, test2 TEXT, test3 TEXT)");
});
await database.transaction((txn) async {
await txn.rawInsert('INSERT INTO tablename(test, test2, test3) VALUES(?, ?, ?)',[test, test2, test3]);
});

它是一个拉DB的类。

class Classname extends StatefulWidget {
Classname({Key key}) : super(key: key);
@override
createState() => _ClassnameState();
}
class _ClassnameState extends State<Classname> {
String test;
String test2;
String test3;
bool isChecked = false;
Future _data;
@override
void initState() {
_data = getData();
super.initState();
}
Future<List<Map>> getData() async {
String path = join(await getDatabasesPath(), 'dbname.db');
Database database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute(
"CREATE TABLE tablename(id INTEGER PRIMARY KEY, test TEXT, test2 TEXT, test3 TEXT)");
});
List<Map> result = await database.rawQuery('SELECT * FROM tablename');
return result;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<List<Map>>(
future: _data,
builder: (context, result) {
      if (result.connectionState == ConnectionState.waiting) {
return Center(
child:
CircularProgressIndicator());
}
if (!result.hasData) {
return Center(
child: Text(
'no data'),
);
}
return SingleChildScrollView(
child: Container(
child: Column(
children: List.generate(result.data.length, (index) {
var data = result.data[index];
test = data['test'];
test2 = data['test2'];
test3 = data['test3'];
data.putIfAbsent('isChecked', () => false);
return Column(
children: [
Row(
children: <Widget>[
Checkbox(
value: data['isChecked'],
onChanged: (bool value) {
setState(() {
data['isChecked'] = value;
});
},
),
Container(
child: Text(
test,
),
),
Container(
child: Text(test2),
),
],
),
Align(
alignment: Alignment.centerLeft,
child: Text(
test3,
),
),
],
);
}),
),
),
);
},
),
);
}
}

我也尝试了下面的代码,引用了这个链接,但我得到了同样的错误。https://pub.flutter-io.cn/documentation/sqflite/latest/sqflite/openReadOnlyDatabase.html

Future<List<Map>> getData() async {
String path = join(await getDatabasesPath(), 'dbname.db');
Database database = await openReadOnlyDatabase(path);
List<Map> result = await database.rawQuery('SELECT * FROM tablename');
return result;
}

请告诉我如何解决。

db.query((方法应该返回一个不可修改的List。获取结果时,不能直接使用接收到的变量来指向它。应该重新生成List。

_data=List.from(getData(((

你看https://github.com/tekartik/sqflite/issues/140#issuecomment-451881301

最新更新