SQFLite: Как получить данные, если значение поля равно json_encode?

#sqlite #flutter

#sqlite #флаттер

Вопрос:

При использовании запроса у меня есть такие данные final result = await db.query(tablePelajaran); print(result) .

Примечание: значение семестра — это объект, который я преобразую в json с помощью json.encode()

 [{id_pelajaran: 1, name_pelajaran: pelajran test, semester: {"id_semester":1,"name_semester":"Semester I"}, hari: [{"id_day":1,"name_day":"Senin","code_color":4294013189},{"id_day":2,"name_day":"Selasa","code_color":4291891529},{"id_day":3,"name_day":"Rabu","code_color":4284879090},{"id_day":4,"name_day":"Kamis","code_color":4279930851}], dosen: }, {id_pelajaran: 2, name_pelajaran: Another Pelajaran, semester: {"id_semester":2,"name_semester":"Semester II"}, hari: [{"id_day":1,"name_day":"Senin","code_color":4294013189},{"id_day":5,"name_day":"Jumat","code_color":4290904315}], dosen: }]
  

Но теперь я хочу показывать только данные, когда семестр = 1, тогда я пишу запрос следующим образом :

     final db = await database();
    final result = await db.rawQuery(
      'SELECT * FROM $tablePelajaran WHERE semester = ? ',
      [1],
    );
    print(result);

  

Но результат всегда нулевой, я ожидал, что будут отображаться данные с id_semester = 1 .
Как я могу получить доступ к id_semester, если этот идентификатор находится внутри json.encode. Я не могу выполнить json.decode (), потому что у меня нет данных семестра при запросе.

Ответ №1:

Как я могу получить доступ к id_semester, если этот идентификатор находится внутри json.encode. Я не могу выполнить json.decode (), потому что у меня нет данных semester при запросе.

Вы должны разделить объект semester на 2 других столбца, чтобы получить доступ к их значениям. Поскольку sqflite является структурной базой данных, она позволяет извлекать значения только на уровне столбца, глубже этого невозможно. Тогда вам нужно только запросить значение столбца semeter_id:

 final result = await db.rawQuery(
  'SELECT * FROM $tablePelajaran WHERE semester_id = ? ',
  [1],
);
  

Еще одно решение, если вам не разрешено изменять структуру базы данных, — это извлечь все данные, а затем проанализировать их в виде списка объектов

 final pelajarans = List<Pelajaran>.from(data.map((rawPelajaran)=>Pelajaran.fromJson(rawPelajaran));
  

где rawPelajaran — это каждый элемент внутри массива, который вы запрашиваете из базы данных.

Затем отсюда вы фильтруете данные:

 var _result = pelajarans.where((e) => e.semesterId == 1).toList;
  

Надеюсь, это поможет!

Комментарии:

1. Можете ли вы привести простой пример? другими словами, я не могу получить доступ к полю, когда используется json.encode ?

2. @ZeffryReynando Я только что обновил свой ответ на случай, если вам не разрешено изменять структуру базы данных

3. Но я на самом деле избегаю показывать все данные, а затем фильтровать их только для получения 1 данных. Поскольку, когда у меня есть, скажем, 300 данных, я хочу показать данные с идентификатором 100, я должен запросить все данные, а затем отфильтровать с помощью списка dart.

4. @ZeffryReynando Вы можете запросить все данные один раз, а затем сохранить их в переменной / локальном хранилище для последующего использования. В противном случае единственный другой способ — создать другую semester таблицу для связи с исходной таблицей или добавить еще 2 столбца для semester_id и name_semester.

Ответ №2:

Здесь в вашем json semester значение на самом деле имеет строковый тип. Вот почему, когда вы хотите получить значение id_semester , оно выдает вам нулевое значение. Чтобы получить значение id_semester , вам нужно преобразовать строку в map. Для этого вы можете использовать jsonDecode . Вот пример:

 final result = await db.query(tablePelajaran);
Map<dynamic, dynamic> map = jsonDecode(result[0]['semester']);
print(map['id_semester']);
  

Комментарии:

1. Хотя этот фрагмент кода может быть решением, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения по кодированию.

Ответ №3:

 var data= await _db.rawQuery('SELECT * FROM $tablePelajaran where json_extract($tablePelajaran.semester,"$.id_semester") =?',[1]);
  

Используя json_extract, вы можете получить доступ к любому json внутри любого столбца…