Flutter I put a DB or dynamic checkbox, but I get a read-only error

Viewed 231

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.

1 Answers
Related