React Native
...
Data objects
1:1 Relationship
11 мин
отношение один к одному введение в основе многих бэкендов вы найдете возможность хранения данных используя parse, вы можете хранить объекты данных, устанавливая отношения между ними отношения данных стандартизируют, как каждый объект данных связан или ассоциирован с другими это может дать вам дополнительную мощь при построении и выполнении сложных запросов существует три основных типа отношений один ко многим один ко многим , где один объект может быть связан с многими другими объектами; один к одному один к одному , устанавливая прямые отношения между двумя объектами и только ими; многие ко многим многие ко многим , что может создать множество сложных отношений между многими объектами в этом руководстве мы сосредоточимся на отношениях один к одному эти отношения распространены в приложениях, связанных с конфиденциальными данными и управлением пользователями, которые требуют уникальных полей, которые необходимо обеспечить, таких как номера удостоверений и номера телефонов бэкенды хранения данных обычно требуют явных деклараций этих ассоциаций, и parse не имеет автоматического решения для достижения таких ассоциаций тем не менее, существуют способы реализации отношений 1 1 в parse, используя parse cloud parse cloud функции на вашем сервере, обеспечивая, чтобы отношения таблиц оставались уникальными перед сохранением данных это достигается созданием beforesave beforesave функций в обоих связанных классах и предотвращением сохранения, если родительский класс уже имеет один экземпляр в дочернем классе, и наоборот вы также можете обрабатывать эти случаи в коде вашего приложения parse, запрашивая сервер перед сохранением и гарантируя указанное отношение это будет показано в этом руководстве, но обратите внимание, что использование облачных функций гораздо чище и более рекомендуется в этом руководстве вы реализуете приложение для регистрации книг на react native, которое содержит три основных типа ассоциаций данных вы научитесь создавать и запрашивать отношения данных один к одному, используя back4app и react native в любое время вы можете получить доступ к этому проекту через наши репозитории на github, чтобы ознакомиться со стилями и полным кодом репозиторий примера на javascript репозиторий примера на typescript предварительные условия для завершения этого учебника вам потребуется приложение react native, созданное и подключенное к back4app если вы хотите протестировать/использовать макет экрана, предоставленный этим руководством, вам следует установить react native paper react native paper библиотеку цель выполнить и продемонстрировать отношения один к одному в базе данных в react native с использованием parse в реалистичном сценарии 1 понимание класса book поскольку в этом руководстве мы будем использовать пример приложения для регистрации книг, вам сначала нужно понять, как организованы объектные отношения в этой базе данных основной класс объекта, который вы будете использовать, это книга книга , который будет хранить каждую запись книги в регистрации вот другие четыре класса объектов издатель издатель название издателя книги, отношение один ко многим с книга книга жанр жанр жанр книги, отношение один ко многим с книга книга обратите внимание, что для этого примера мы будем считать, что у книги может быть только один жанр; автор автор автор книги, отношение многие ко многим с книга книга , поскольку у книги может быть более одного автора, и у автора может быть более одной книги; isdb isdb идентификационный номер книги isdb, отношение один к одному с книга книга , поскольку этот номер уникален для каждой книги вот визуальное представление этих таблиц базы данных для простоты мы будем предполагать, что каждый класс объекта имеет только строковый тип имя имя атрибута ( название название для книги книги ), помимо любых дополнительных реляционных атрибутов 2 создание отношений один ко многим перед тем как перейти к этому шагу, мы рекомендуем вам клонировать и запустить пример приложения react native library ( репозиторий примера на javascript , репозиторий примера на typescript ) это приложение имеет два основных экрана один отвечает за отображение зарегистрированных книг, а другой за создание новых книг в форме регистрации книги есть прямые ссылки на другие связанные объекты и поле textinput textinput для значения isbd книги, которое будет использоваться для создания вашего отношения один к одному давайте взглянем на метод создания книги, который вызывается при отправке этой формы javascript 1 const createbook = async function () { 2 try { 3 // these values come from state variables linked to 4 // the screen form fields, retrieving the user choices 5 // as a complete parse object, when applicable; 6 const booktitlevalue = booktitle; 7 const bookisbdvalue = bookisbd; 8 // for example, bookpublisher holds the value from 9 // radiobutton group field with its options being every 10 // publisher parse object instance saved on server, which is 11 // queried on screen load via useeffect 12 const bookpublisherobject = bookpublisher; 13 const bookgenreobject = bookgenre; 14 // bookauthors can be an array of parse objects, since the book 15 // may have more than one author 16 const bookauthorsobjects = bookauthors; 17	 18 // creates a new parse object instance 19 let book = new parse object('book'); 20	 21 // set data to parse object 22 // simple title field 23 book set('title', booktitlevalue); 24	 25 // 1 1 relation, need to check for uniqueness of value before creating a new isbd object 26 let isbdquery = new parse query('isbd'); 27 isbdquery equalto('name', bookisbdvalue); 28 let isbdqueryresult = await isbdquery first(); 29 if (isbdqueryresult !== null && isbdqueryresult !== undefined) { 30 // if first returns a valid object instance, it means that there 31 // is at least one instance of isbd with the informed value 32 alert alert( 33 'error!', 34 'there is already an isbd instance with this value!', 35 ); 36 return false; 37 } else { 38 // create a new isbd object instance to create a one to one relation on saving 39 let isbd = new parse object('isbd'); 40 isbd set('name', bookisbdvalue); 41 isbd = await isbd save(); 42 // set the new object to the new book object isbd field 43 book set('isbd', isbd); 44 } 45	 46 // one to many relations can be set in two ways 47 // add direct object to field (parse will convert to pointer on save) 48 book set('publisher', bookpublisherobject); 49 // or add pointer to field 50 book set('genre', bookgenreobject topointer()); 51	 52 // many to many relation 53 // create a new relation so data can be added 54 let authorsrelation = book relation('authors'); 55 // bookauthorsobjects is an array of parse objects, 56 // you can add to relation by adding the whole array or object by object 57 authorsrelation add(bookauthorsobjects); 58	 59 // after setting the values, save it on the server 60 try { 61 await book save(); 62 // success 63 alert alert('success!'); 64 navigation goback(); 65 return true; 66 } catch (error) { 67 // error can be caused by lack of internet connection 68 alert alert('error!', error message); 69 return false; 70 } 71 } catch (error) { 72 // error can be caused by lack of value selection 73 alert alert( 74 'error!', 75 'make sure to select valid choices in publisher, genre and author fields!', 76 ); 77 return false; 78 } 79 }; todolist tsx 1 const createbook = async function () promise\<boolean> { 2 try { 3 // these values come from state variables linked to 4 // the screen form fields, retrieving the user choices 5 // as a complete parse object, when applicable; 6 const booktitlevalue string = booktitle; 7 const bookisbdvalue string = bookisbd; 8 // for example, bookpublisher holds the value from 9 // radiobutton group field with its options being every 10 // publisher parse object instance saved on server, which is 11 // queried on screen load via useeffect 12 const bookpublisherobject parse object = bookpublisher; 13 const bookgenreobject parse object = bookgenre; 14 // bookauthors can be an array of parse objects, since the book 15 // may have more than one author 16 const bookauthorsobjects \[parse object] = bookauthors; 17	 18 // creates a new parse object instance 19 let book parse object = new parse object('book'); 20	 21 // set data to parse object 22 // simple title field 23 book set('title', booktitlevalue); 24	 25 // 1 1 relation, need to check for uniqueness of value before creating a new isbd object 26 let isbdquery parse query = new parse query('isbd'); 27 isbdquery equalto('name', bookisbdvalue); 28 let isbdqueryresult parse object = await isbdquery first(); 29 if (isbdqueryresult !== null && isbdqueryresult !== undefined) { 30 // if first returns a valid object instance, it means that there 31 // is at least one instance of isbd with the informed value 32 alert alert( 33 'error!', 34 'there is already an isbd instance with this value!', 35 ); 36 return false; 37 } else { 38 // create a new isbd object instance to create a one to one relation on saving 39 let isbd parse object = new parse object('isbd'); 40 isbd set('name', bookisbdvalue); 41 isbd = await isbd save(); 42 // set the new object to the new book object isbd field 43 book set('isbd', isbd); 44 } 45	 46 // one to many relations can be set in two ways 47 // add direct object to field (parse will convert to pointer on save) 48 book set('publisher', bookpublisherobject); 49 // or add pointer to field 50 book set('genre', bookgenreobject topointer()); 51	 52 // many to many relation 53 // create a new relation so data can be added 54 let authorsrelation = book relation('authors'); 55 // bookauthorsobjects is an array of parse objects, 56 // you can add to relation by adding the whole array or object by object 57 authorsrelation add(bookauthorsobjects); 58	 59 // after setting the values, save it on the server 60 try { 61 await book save(); 62 // success 63 alert alert('success!'); 64 navigation goback(); 65 return true; 66 } catch (error) { 67 // error can be caused by lack of internet connection 68 alert alert('error!', error message); 69 return false; 70 } 71 } catch (error) { 72 // error can be caused by lack of value selection 73 alert alert( 74 'error!', 75 'make sure to select valid choices in publisher, genre and author fields!', 76 ); 77 return false; 78 } 79 }; посмотрите, как bookisbdvalue bookisbdvalue установлен для новой книги parse object parse object экземпляра создание и сохранение отношений один к одному и один ко многим в parse — это схожие процессы, в которых вы передаете в качестве аргумента parse object parse object экземпляр, используя parse object set parse object set метод, который принимает два аргумента имя поля и значение, которое нужно установить здесь уловка в том, что перед сохранением вам нужно убедиться, что в вашей базе данных нет isbd isbd объектов, содержащих указанный строковый идентификатор isbd, и что нет книга книга объектов, уже связанных с ним вторая часть всегда будет верна в этом случае, так как вы создаете новый книга книга объект каждый раз обеспечение уникальности isbd isbd может быть достигнуто с помощью следующего выделенного запроса javascript 1 let isbdquery = new parse query('isbd'); 2 isbdquery equalto('name', bookisbdvalue); 3 let isbdqueryresult = await isbdquery first(); 4 if (isbdqueryresult !== null && isbdqueryresult !== undefined) { 5 // if first returns a valid object instance, it means that there 6 // is at least one instance of isbd with the informed value 7 alert alert( 8 'error!', 9 'there is already an isbd instance with this value!', 10 ); 11 return false; 12 } todolist tsx 1 let isbdquery parse query = new parse query('isbd'); 2 isbdquery equalto('name', bookisbdvalue); 3 let isbdqueryresult parse object = await isbdquery first(); 4 if (isbdqueryresult !== null && isbdqueryresult !== undefined) { 5 // if first returns a valid object instance, it means that there 6 // is at least one instance of isbd with the informed value 7 alert alert( 8 'error!', 9 'there is already an isbd instance with this value!', 10 ); 11 return false; 12 } после успешного сохранения ваших объектов, parse создаст столбец типа данных указателя и прямую ссылку на вашей панели управления для быстрого доступа 3 запрос одно ко одному отношений запрос объектов с отношением один к одному довольно прост, так как большая часть этого обрабатывается parse посмотрите на функцию запроса на экране списка регистра книг javascript 1 const querybooks = async function () { 2 // these values come from state variables linked to 3 // the screen query radiobutton group fields, with its options being every 4 // parse object instance saved on server from the referred class, which is 5 // queried on screen load via useeffect; these variables retrievie the user choices 6 // as a complete parse object; 7 const querypublishervalue = querypublisher; 8 const querygenrevalue = querygenre; 9 const queryauthorvalue = queryauthor; 10 const queryisbdvalue = queryisbd; 11	 12 // reading parse objects is done by using parse query 13 const parsequery = new parse query('book'); 14	 15 // one to many queries 16 if (querypublishervalue !== '') { 17 parsequery equalto('publisher', querypublishervalue); 18 } 19 if (querygenrevalue !== '') { 20 parsequery equalto('genre', querygenrevalue); 21 } 22	 23 // one to one query 24 if (queryisbdvalue !== '') { 25 parsequery equalto('isbd', queryisbdvalue); 26 } 27	 28 // many to many query 29 // in this case, we need to retrieve books related to the chosen author 30 if (queryauthorvalue !== '') { 31 parsequery equalto('authors', queryauthorvalue); 32 } 33	 34 try { 35 let books = await parsequery find(); 36 // many to many objects retrieval 37 // in this example we need to get every related author parse object 38 // and add it to our query result objects 39 for (let book of books) { 40 // this query is done by creating a relation and querying it 41 let bookauthorsrelation = book relation('authors'); 42 book authorsobjects = await bookauthorsrelation query() find(); 43 } 44 setqueriedbooks(books); 45 return true; 46 } catch (error) { 47 // error can be caused by lack of internet connection 48 alert alert('error!', error message); 49 return false; 50 } 51 }; todolist tsx 1 const querybooks = async function () promise\<boolean> { 2 // these values come from state variables linked to 3 // the screen query radiobutton group fields, with its options being every 4 // parse object instance saved on server from the referred class, which is 5 // queried on screen load via useeffect; these variables retrievie the user choices 6 // as a complete parse object; 7 const querypublishervalue parse object = querypublisher; 8 const querygenrevalue parse object = querygenre; 9 const queryauthorvalue parse object = queryauthor; 10 const queryisbdvalue parse object = queryisbd; 11	 12 // reading parse objects is done by using parse query 13 const parsequery parse query = new parse query('book'); 14	 15 // one to many queries 16 if (querypublishervalue !== '') { 17 parsequery equalto('publisher', querypublishervalue); 18 } 19 if (querygenrevalue !== '') { 20 parsequery equalto('genre', querygenrevalue); 21 } 22	 23 // one to one query 24 if (queryisbdvalue !== '') { 25 parsequery equalto('isbd', queryisbdvalue); 26 } 27	 28 // many to many query 29 // in this case, we need to retrieve books related to the chosen author 30 if (queryauthorvalue !== '') { 31 parsequery equalto('authors', queryauthorvalue); 32 } 33	 34 try { 35 let books \[parse object] = await parsequery find(); 36 // many to many objects retrieval 37 // in this example we need to get every related author parse object 38 // and add it to our query result objects 39 for (let book of books) { 40 // this query is done by creating a relation and querying it 41 let bookauthorsrelation = book relation('authors'); 42 book authorsobjects = await bookauthorsrelation query() find(); 43 } 44 setqueriedbooks(books); 45 return true; 46 } catch (error) { 47 // error can be caused by lack of internet connection 48 alert alert('error!', error message); 49 return false; 50 } 51 }; в этом случае, чтобы запросить любые книги, связанные с конкретным isbd, вам нужно просто выполнить метод parse query equalto parse query equalto передав экземпляр parse object parse object в качестве параметра после запроса parse сохранит внутри результирующих объектов полные экземпляры любых полей с отношением один к одному чтобы извлечь и показать данные из этих экземпляров объектов, вы можете связать метод parse object get parse object get следующим образом bookparseobject get(('isbd') get('name') bookparseobject get(('isbd') get('name') вот как выглядит экран списка, используя эти геттеры для извлечения имени isbd из элементов списка заключение в конце этого руководства вы узнали, как создавать и запрашивать отношения один к одному в parse на react native в следующем руководстве мы покажем вам, как регистрировать пользователей