Flutter
...
Data Objects
Реализация связи многие-ко-многим на Flutter с Parse
11 мин
многие ко многим отношения на flutter введение в предыдущем руководстве мы узнали, как использовать отношения один ко многим, и мы продолжим наш проект в этом руководстве мы сосредоточимся на самом распространенном отношении многие ко многим существует три способа создания отношения многие ко многим в parse первый способ — использовать parse отношения отношения , что является самым быстрым способом создания и выполнения запросов мы будем использовать это в этом руководстве второй способ — использовать массивы массивы указатели указатели которые могут привести к медленным временам выполнения запросов в зависимости от их размера третий способ — использовать jointable jointable где идея взята из классической базы данных когда существует отношение многие ко многим, мы объединяем каждый objectid objectid или указатель указатель с обеих сторон вместе, чтобы создать новую отдельную таблицу, в которой отслеживается отношение в этом руководстве вы реализуете отношение многие ко многим отношение многие ко многим в приложении регистрации книг на flutter, используя parse отношения отношения вы узнаете, как создавать и выполнять запросы к данным с отношениями многие ко многим и как выполнять запросы, возвращающие данные из связанных объектов, используя back4app и flutter sdk предварительные требования android studio https //developer android com/studio или vs code установлен (с плагинами dart и flutter) примечание приложение flutter, созданное в предыдущем руководстве завершите предыдущее руководство, чтобы лучше понять отношение один ко многим отношение один ко многим класса устройство (или виртуальное устройство), работающее на android или ios 1 запустите шаблон приложения book если вы не завершили предыдущее руководство, вы можете клонировать и запустить полный book flutter app https //github com/templates back4app/flutter associations проект из нашего репозитория вы также можете ознакомиться с предыдущим руководством https //www back4app com/docs/flutter/parse sdk/data objects/%7bsite baseurl%7d%7d//flutter/parse sdk/data objects/flutter one to many relationship для лучшего понимания шаблона приложения ниже вы можете найти визуальное представление модели данных регистрации книг 2 сохраните объект книги и его автора откройте проект flutter из предыдущего руководства отношение один ко многим в flutter https //www back4app com/docs//flutter/parse sdk/data objects/flutter one to many relationship найдите функцию dosavebook dosavebook в файле main dart main dart , и замените ее кодом ниже внутри функции future\<void> dosavebook() future\<void> dosavebook() эта функция создаст новую книгу в хранилище данных back4app с отношениями 1 final book = parseobject('book') 2 set('title', controllertitle text trim()) 3 set('year', int parse(controlleryear text trim())) 4 //the objectid will be converted to a pointer on the save() method 5 set('genre', parseobject('genre') objectid = genre objectid) 6 //you can also convert to a pointer object before the saving using the topointer() method 7 set('publisher', 8 (parseobject('publisher') objectid = publisher objectid) topointer()) 9 //saving a list of authors for the book 10 addrelation( 11 'authors', 12 authors 13 map((o) => parseobject('author') objectid = o objectid) 14 tolist()); 15 16 await book save(); чтобы создать эту функцию, выполните следующие шаги 1\ создайте новый экземпляр класса parse книга книга с помощью команды parseobject('книга') parseobject('книга') 2 используйте установить установить функцию, чтобы установить поля для этого объекта 2 1 название название это текстовые атрибуты, которые получают значение от текстового контроллера 2 2 жанр жанр получает значение, определяя parseobject parseobject с objectid objectid выбранного жанр жанр ( parse будет конвертировать в указатель при сохранении ) 2 3 издатель издатель получает значение, определяя parseobject parseobject с objectid objectid выбранного издателя издателя ( обратите внимание, что мы можем указать для parse, что хотим сохранить как указатель указатель с помощью topointer() topointer() метода ) 2 4 авторы авторы мы называем addrelation addrelation метод parseobject parseobject , отправляя список parseobject parseobject с objectid objectid выбранных авторов авторов 3 вызовите сохранить сохранить функцию в parseobject parseobject , которая эффективно зарегистрирует объект в вашей базе данных на панели управления back4app запустите приложение и протестируйте новую dosavebook() dosavebook() функцию сначала зайдите на панель управления и удалите книги, которые были ранее зарегистрированы в предыдущем руководстве нажмите на добавить книгу добавить книгу кнопку заполните информацию о книге с авторами нажмите на сохранить книгу сохранить книгу кнопку чтобы подтвердить, что новый объект сохранен в базе данных с отношениями, вы можете получить доступ к back4app dashboard back4app dashboard и получить доступ к book book классу нажатие на указатель объекта/значение отношения на вашей панели управления перенаправит вас на запись ссылочного объекта это может показаться безобидной функцией, но это значительно ускоряет отладку и отслеживание ошибок по сравнению с ручным поиском 3 запросить детали книги с отношениями эта функция будет запрашивать детали книги в базе данных back4app, возвращая данные о связях в некоторых ситуациях вы хотите вернуть несколько типов связанных объектов в одном запросе вы можете сделать это с помощью includeobject includeobject метода в нашем примере мы хотим вернуть книги с информацией из жанра и издателей ищите функцию getbookdetail getbookdetail в файле main dart main dart , затем замените код ниже внутри getbookdetail(parseobject book) getbookdetail(parseobject book) функции 1 querybuilder\<parseobject> querybook = 2 querybuilder\<parseobject>(parseobject('book')) 3 whereequalto('objectid', book objectid) 4 includeobject(\['publisher', 'genre']); 5 6 final parseresponse responsebook = await querybook query(); 7 8 if (responsebook success && responsebook results != null) { 9 final book = (responsebook results first) as parseobject; 10 booktitle = book get\<string>('title'); 11 bookyear = book get\<int>('year'); 12 bookgenre = book get\<parseobject>('genre') get\<string>('name'); 13 bookpublisher = book get\<parseobject>('publisher') get\<string>('name'); 14 loadeddata = true; 15 } 16 17 querybuilder\<parseobject> queryauthors = 18 querybuilder\<parseobject>(parseobject('author')) 19 whererelatedto('authors', 'book', book objectid); 20 21 final parseresponse responseauthors = await queryauthors query(); 22 23 if (responseauthors success && responseauthors results != null) { 24 bookauthors = responseauthors results 25 map((e) => (e as parseobject) get\<string>('name')) 26 tolist(); 27 } чтобы создать эту функцию, выполните следующие шаги создайте экземпляр parsequery parsequery объекта для книга книга класса вставьте условие в запрос, чтобы искать книги книги где objectid objectid поле равно objectid objectid выбранной книги мы используем метод includeobject, указывая поля указателей, данные которых мы хотим вернуть в том же запросе жанр и издатель вы также можете делать многоуровневый includeobject, используя точечную нотацию пример ` includeobject(\[‘post’, ‘post authors’]); выполните метод поиска запроса, используя query() query() метод если операции успешны, объект в книга книга будет возвращен мы используем метод get для получения данных для полей, которые являются указателями, нам сначала нужно получить указатель, а затем получить его данные пример bookgenre = book get\<parseobject>('genre') get\<string>('name'); bookgenre = book get\<parseobject>('genre') get\<string>('name'); на втором этапе обработки нам нужно восстановить авторов, связанных с книгой чтобы создать эту функцию, выполните следующие шаги создайте экземпляр parsequery parsequery объекта для класса authors authors вставьте условие в запрос, используя whererelatedto whererelatedto оператор для поиска authors authors связи с book book , где book book равен objectid objectid выбранной книги выполните метод поиска запроса, используя query() query() метод если операции успешны, объект в book book будет возвращен мы используем метод get для получения данных запустите приложение и протестируйте новый запрос сначала нажмите на кнопку список издателей/книг список издателей/книг выберите книгу из списка на следующем экране будут отображены данные о книгах и их отношениях готово! на этом этапе вы узнали, как создавать и запрашивать отношения многие ко многим и как выполнять запросы, возвращающие данные из связанных объектов в parse на flutter flutter