未处理的异常:类型“Null”不是 SQ Lite 上类型“String”的子类型

Unhandled Exception: type 'Null' is not a subtype of type 'String' on SQ Lite

提问人:Hikmet Melik 提问时间:10/27/2023 最后编辑:Hikmet Melik 更新时间:10/27/2023 访问量:29

问:

我正在使用sqlite数据库并尝试从sqlite文件中获取数据。我复制了我的数据库,没有错误。但是当我尝试获取数据以在我的应用程序上显示时,数据为空。我正在调试我的代码并试图了解问题出在哪里,但我不明白。那么你们能帮我吗?

class StudentsModel {
  final int studentId;
  final String studentName;
  final String studentEmail;

  StudentsModel({required this.studentId, required this.studentName, required this.studentEmail});
}

这是我的模型页面和

  Future<List<StudentsModel>?> getAllStudents() async {
    var db = await DatabaseCopy.databaseAccess();
    List<Map<String, dynamic>> listOfStudents = await db.rawQuery("SELECT * FROM students");
    return List.generate(listOfStudents.length, (index) {
      var row = listOfStudents[index];
      return StudentsModel(
        studentId: row["student_id"],
        studentName: row["student_name"],
        studentEmail: row["student_email"],
      );
    });
  }

我的存储库页面。此处是控制台错误消息。谢谢!

伙计们新更新。当我尝试从数据库中搜索学生时,它可以工作,但问题是将所有学生显示到主页。我正在添加新的东西来理解问题。

@override
  void initState() {
    super.initState();
    context.read<HomepageCubit>().loadAllStudents();
  }

这是尝试在主页上显示所有学生的一部分

body: BlocBuilder<HomepageCubit, List<StudentsModel>>(
          builder: (context, studentsList) {
            if (studentsList.isNotEmpty) {
              return ListView.builder(
                itemCount: studentsList.length,
                itemBuilder: (context, index) {
                  var student = studentsList[index];
                  return ListTile(
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => StudentDetailPage(
                            studentsModel: student,
                          ),
                        ),

最后一部分是主页肘

class HomepageCubit extends Cubit<List<StudentsModel>> {
  HomepageCubit() : super(<StudentsModel>[]);

  final sRepo = StudentsRepository();

  Future<void> loadAllStudents() async {
    final allStudentsList = await sRepo.getAllStudents();
    emit(allStudentsList!);
  }
Android Flutter SQLite 飞镖

评论

0赞 Daniele974 10/27/2023
您是否至少找到了问题可能所在的“区域”?例如,sRepo.getAllStudents() 是否返回一些数据?如果没有,您是否尝试在“studentId: row[”student_id“]”行上放置断点?执行是否达到这一点?如果是,哪个是“row[”student_id“]”表达式的结果?它是空的吗?
0赞 Hikmet Melik 10/27/2023
怎么可能,我无法理解。搜索学生代码和 showAllStudents 方法相同,但主要问题是主页中的 showAllStudents。我将再次尝试调试我的代码。我很快就会带着结果回来。
0赞 Daniele974 10/27/2023
您链接的图像中显示的错误似乎是由作业 studentName: row[“student_name”] 或 studentEmail: row[“student_email”] 引起的,您尝试将 Null 值分配给不可为 null 的字符串。我认为从数据库检索到的数据为空或在某些条目的某些字段中有一些缺失值。
0赞 Daniele974 10/27/2023
例如,如果学生没有电子邮件,则student_email字段将为 null,因此您不能将该值分配给 String 变量。在这种情况下,您应该将 studentEmail 声明为 String?类型,可为 null
0赞 Hikmet Melik 10/27/2023
我想我要将新数据库从数据库浏览器添加到我的项目中。因为主要问题来自我的数据库。

答:

0赞 Hikmet Melik 10/27/2023 #1

我解决了我自己的问题。你们使用DB浏览器时要小心。所以主要问题太荒谬了。当我创建一个新数据库时,我单击了“查看数据”,不小心创建了一个新的空行。所以我无法在屏幕上显示空白数据,因为第一行的数据是空的,但我能够搜索。