I want to pull the database in Flutter and list it with dynamic checkboxes as well, but I get an error. There was an error on the simulator and the error message was 'Unsupported operation: read-only'. On the console, I was getting the error message 'The following UnsupportedError was thrown building FutureBuilder<List<Map<dynamic, dynamic>>>(dirty, state: _FutureBuilderState<List<Map<dynamic, dynamic>>>#433fa): Unsupported operation: read-only'.
DB is already stored like this.
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]);
});
It is a class that pulls 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,
),
),
],
);
}),
),
),
);
},
),
);
}
}
I also tried the code below, referring to this link, but I got the same error. 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;
}
Please tell me how to resolve.