#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 внутри любого столбца…