Создание отношений 1:М в Parse для Flutter приложений
16 мин
отношение один ко многим в flutter введение используя parse, вы можете хранить объекты данных, устанавливая отношения между ними для моделирования этого поведения любой \<font color="#2166ae">parseobject\</font> может использоваться как значение в других \<font color="#2166ae">parseobject\</font> внутри фреймворка parse будет храниться упоминаемый объект в одном месте, чтобы поддерживать согласованность это может дать вам дополнительную мощь при построении и выполнении сложных запросов существует три основных типа отношений \<font color="#2166ae">один к одному\</font> , устанавливая прямые отношения между двумя объектами и только ими; \<font color="#2166ae">один ко многим\</font> , где один объект может быть связан с многими другими объектами; \<font color="#2166ae">многие ко многим\</font> , что может создать множество сложных отношений между многими объектами в этом руководстве мы подробно расскажем, как работает \<font color="#2166ae">один ко многим\</font> отношение, используя практический пример приложения существует два способа создания \<font color="#2166ae">один ко многим\</font> отношения в parse первый способ использовать \<font color="#2166ae">указатели\</font> в \<font color="#2166ae">дочернем классе\</font> , что является самым быстрым способом по времени создания и запросов второй способ использовать \<font color="#2166ae">массивы\</font> \<font color="#2166ae">указателей\</font> в родительском классе, что может привести к медленным временам запросов в зависимости от их размера из за этой проблемы с производительностью мы будем использовать только примеры с указателями вы реализуете приложение для регистрации книг на flutter и создадите и запросите связанные объекты, используя \<font color="#2166ae">указатели\</font> отношение как \<font color="#2166ae">один к одному\</font> не является распространенным, и мы не будем его рассматривать в наших руководствах в качестве примера можно привести отношение между классом пользователь и другим классом, который будет содержать конфиденциальные данные пользователя по причинам безопасности https //blog back4app com/parse server best practices/ ( 1 4 не позволяйте пользователям получать доступ к конфиденциальным данным других ) предварительные требования версия flutter 2 2 x или новее https //flutter dev/docs/get started/install android studio https //developer android com/studio или установленный vs code https //code visualstudio com/ (с плагинами https //docs flutter dev/get started/editor dart и flutter) приложение созданное https //www back4app com/docs/get started/new parse app на back4app примечание следуйте учебнику по созданию нового parse app https //www back4app com/docs/get started/new parse app чтобы узнать, как создать parse app на back4app flutter приложение, подключенное к back4app примечание следуйте установите parse sdk в проект flutter https //www back4app com/docs/flutter/parse sdk/parse flutter sdk чтобы создать проект flutter, подключенный к back4app устройство (или виртуальное устройство), работающее на android или ios понимание приложения book основной класс объекта, который вы будете использовать, это класс \<font color="#2166ae">книга\</font> , хранящий каждую запись книги в реестре также это другие три класса объектов \<font color="#2166ae">издатель\</font> имя издателя книги, отношение «один ко многим» с \<font color="#2166ae">книга\</font> ; \<font color="#2166ae">жанр\</font> жанр книги, отношение «один ко многим» с \<font color="#2166ae">книга\</font> обратите внимание, что в этом примере мы будем считать, что у книги может быть только один жанр; \<font color="#2166ae">автор\</font> автор книги, отношение «многие ко многим» с \<font color="#2166ae">книга\</font> , поскольку у книги может быть более одного автора, и у автора может быть более одной книги; визуальное представление этой модели данных мы предположим, что каждый класс объекта ( \<font color="#2166ae">издатель\</font> , \<font color="#2166ae">жанр\</font> ) имеет только строковый тип \<font color="#2166ae">имя\</font> атрибут и \<font color="#2166ae">книга\</font> имеет \<font color="#2166ae">название\</font> и \<font color="#2166ae">год\</font> , помимо любых дополнительных реляционных атрибутов в предыдущих руководствах мы уже видели, как сохранять и читать \<font color="#2166ae">parseobject\</font> поэтому в этом руководстве мы не будем рассматривать, как сохранять и читать \<font color="#2166ae">жанр\</font> и \<font color="#2166ae">издатель\</font> объекты вы найдете следующие экраны в приложении книга регистрация и список жанров регистрация и список издателей регистрация книги список издателей и книг детали книги мы не будем объяснять код приложения flutter, так как основное внимание в этом руководстве уделяется использованию flutter с parse с использованием отношений 1 создание шаблона приложения для книг сначала запустим шаблон проекта приложения для книг откройте свой проект flutter из предыдущего руководства flutter плагин для parse server репозиторий book flutter app https //github com/templates back4app/flutter associations также доступен для клонирования и запуска проекта скопируйте файл main dart https //github com/templates back4app/flutter associations/blob/master/lib/main dart и замените свой текущий код из предыдущих руководств примечание когда \<font color="#2166ae">debug\</font> параметр в функции \<font color="#2166ae">parse() initialize\</font> равен \<font color="#2166ae">true\</font> , это позволяет отображать вызовы api parse в консоли эта конфигурация может помочь в отладке кода рекомендуется отключить отладку в версии для выпуска шаг 2 подключите шаблон к проекту back4app найдите свои учетные данные application id и client key, перейдя на панель управления вашего приложения по адресу панель управления back4app >настройки приложения >безопасность и ключи https //www back4app com/docs/parse dashboard/app settings обновите свой код в \<font color="#2166ae">main dart\</font> с значениями applicationid и clientkey вашего проекта в back4app keyapplicationid = app id keyclientkey = client key запустите проект, и приложение загрузится, как показано на изображении нажмите на \<font color="#2166ae">добавить жанр\</font> для регистрации и просмотра списка \<font color="#2166ae">жанров\</font> которые будут использоваться при регистрации книг нажмите на \<font color="#2166ae">добавить издателя\</font> для регистрации и просмотра списка \<font color="#2166ae">издателей\</font> которые будут использоваться для регистрации книг нажмите на \<font color="#2166ae">добавить книгу\</font> для регистрации новой \<font color="#2166ae">книги\</font> с использованием отношений с \<font color="#2166ae">жанром\</font> и \<font color="#2166ae">издателем\</font> нажмите на \<font color="#2166ae">список издателей/книг\</font> для просмотра списка \<font color="#2166ae">издателей\</font> и \<font color="#2166ae">книг\</font> 3 сохранить объект книги и его отношения эта функция создаст новую книгу в базе данных back4app с отношениями найдите функцию \<font color="#2166ae">dosavebook\</font> в файле \<font color="#2166ae">main dart\</font> , и вставьте код ниже внутрь функции \<font color="#2166ae">future\<void\> dosavebook()\</font> 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( 8 'publisher', 9 (parseobject('publisher') objectid = publisher objectid) 10 topointer()); 11 12 await book save(); чтобы создать эту функцию, выполните следующие шаги 1\ создайте новый экземпляр класса parse \<font color="#2166ae">book\</font> с помощью команды \<font color="#2166ae">parseobject('book')\</font> 2 используйте функцию \<font color="#2166ae">set\</font> для установки полей этого объекта 2 1 \<font color="#2166ae">title\</font> — это текстовый атрибут, который получает значение от текстового контроллера 2 2 \<font color="#2166ae">genre\</font> получает значение, определяя \<font color="#2166ae">parseobject\</font> с \<font color="#2166ae">objectid\</font> выбранного \<font color="#2166ae">genre\</font> ( parse преобразует в указатель при сохранении ) 2 3 \<font color="#2166ae">publisher\</font> получает значение, определяя \<font color="#2166ae">parseobject\</font> с \<font color="#2166ae">objectid\</font> выбранного \<font color="#2166ae">publisher\</font> ( обратите внимание, что мы можем указать для parse, что хотим сохранить как \<font color="#2166ae">pointer\</font> с помощью метода \<font color="#2166ae">topointer()\</font> ) 3 вызовите функцию \<font color="#2166ae">save\</font> в \<font color="#2166ae">parseobject\</font> , которая фактически зарегистрирует объект в вашей базе данных на панели управления back4app запустите приложение и протестируйте новую функцию нажмите на \<font color="#2166ae">добавить книгу\</font> кнопку заполните информацию о книге приложение требует выбора авторов, но код для них будет представлен только в следующем руководстве нажмите на \<font color="#2166ae">сохранить книгу\</font> кнопку чтобы подтвердить, что новый объект сохранен в базе данных с отношениями, вы можете получить доступ к \<font color="#2166ae">back4app dashboard\</font> и получить доступ к \<font color="#2166ae">book\</font> классу если вы получите доступ к вашему классу book через dashboard, вы можете нажать на значение указателя объекта, и вы будете перенаправлены на ссылочный объект это может показаться безобидной функцией, но это значительно ускоряет отладку и отслеживание ошибок по сравнению с ручным поиском 4 запросите список книг и связанные с ними объекты эта функция будет запрашивать книги в базе данных back4app с использованием отношений с издателем через издателя мы получим список книг ищите функцию \<font color="#2166ae">getbooklist\</font> в файле \<font color="#2166ae">main dart\</font> , затем замените код ниже внутри \<font color="#2166ae">future\<list\<parseobject\>\> getbooklist(string publisherid)\</font> функции 1 querybuilder\<parseobject> querybook = 2 querybuilder\<parseobject>(parseobject('book')) 3 whereequalto('publisher', 4 (parseobject('publisher') objectid = publisherid) topointer()) 5 orderbyascending('title'); 6 final parseresponse apiresponse = await querybook query(); 7 8 if (apiresponse success && apiresponse results != null) { 9 return apiresponse results; 10 } else { 11 return \[]; 12 } чтобы создать эту функцию, выполните следующие шаги создайте экземпляр \<font color="#2166ae">parsequery\</font> объекта для \<font color="#2166ae">book\</font> класса вставьте условие в запрос, чтобы искать \<font color="#2166ae">книги\</font> где поле \<font color="#2166ae">publisher\</font> равно \<font color="#2166ae">указателю\</font> на \<font color="#2166ae">publisher parseobject\</font> мы сортируем результат в порядке возрастания \<font color="#2166ae">имени\</font> выполните метод поиска запроса, используя \<font color="#2166ae">query()\</font> метод если операции успешны, объекты в \<font color="#2166ae">book\</font> будут возвращены запустите приложение и протестируйте новый запрос сначала нажмите кнопку \<font color="#2166ae">список издатель/книга\</font> сделано! на данный момент вы узнали, как создавать и запрашивать отношения «один ко многим» в parse на \<font color="#2166ae">flutter\</font> в следующем руководстве мы покажем вам, как создать отношения «многие ко многим» и как выполнять запросы, возвращающие данные из связанных объектов