[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Unsupported operation: read-only

使用 sqfite(sqlite本地存储)问题:

问题描述:

使用sqfite库从sqlite读取数据后,对数据进行修改时报错。

我的代码:

  List> _data;

  Future>> getCitys() async {
    return _db?.query('citys', columns: ['id', 'name', 'pinyin']);
  }

  @override
  void initState() {
    super.initState();
    openDatabase('city_db').then((Database db) {
      _db = db;
      _db.execute(
      '''
      create table IF NOT EXISTS citys(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name varchar(20),
        pinyin varchar(40)
      )
      '''
      ).then((value) {
        getCitys().then((data) {
          setState(() {
            _data = data;  //问题在这
          });
        });
      });
    });
  }
Map m = {
                        'name': res[0].toString(),
                        'pinyin': res[1].toString()
                      };
  _data.add(m); // 这里向读取出来的数据中插入数据,然后就报错了。

错误信息:

E/flutter (11487): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Unsupported operation: read-only
E/flutter (11487): #0      QueryResultSet.length= 
package:sqflite/src/collection_utils.dart:112
E/flutter (11487): #1      ListMixin.add  (dart:collection/list.dart:263:15)
E/flutter (11487): #2      _MyAppState.build. 
package:sqlite_demo/main.dart:99
E/flutter (11487): #3      _asyncThenWrapperHelper.  (dart:async-patch/async_patch.dart:73:64)
E/flutter (11487): #4      _rootRunUnary  (dart:async/zone.dart:1134:38)
E/flutter (11487): #5      _CustomZone.runUnary  (dart:async/zone.dart:1031:19)
E/flutter (11487): #6      _FutureListener.handleValue  (dart:async/future_impl.dart:139:18)
E/flutter (11487): #7      Future._propagateToListeners.handleValueCallback  (dart:async/future_impl.dart:680:45)
E/flutter (11487): #8      Future._propagateToListeners  (dart:async/future_impl.dart:709:32)
E/flutter (11487): #9      Future._completeWithValue  (dart:async/future_impl.dart:524:5)

问题原因:

应该是db.query()方法返回的是一个不可修改的List,在取结果时不能直接用接收的变量去指向它,应该重新构建一个List。

解决方法:

把读取的数据使用copy的方式赋值(直接赋值会)
我这里使用 List.from()
_data = data 改为_data = List.from(data) ;
如果数据比较复杂,需要使用深拷贝的方式。

你可能感兴趣的:(flutter)