Flutter
...
Data Queries
Consultas Avançadas com QueryBuilder no Flutter: Guia Técnico
17 min
livro de receitas de consulta em flutter introdução já vimos como um querybuilder querybuilder com get get pode recuperar um único parseobject parseobject do back4app existem muitas outras maneiras de recuperar dados com querybuilder querybuilder você pode recuperar muitos objetos de uma vez, usar condições nos objetos que deseja recuperar, e mais neste guia, você irá se aprofundar na querybuilder querybuilder classe e ver todos os métodos que você pode usar para construir suas consultas você usará uma classe de banco de dados simples com alguns dados simulados para realizar as consultas usando flutter no back4app pré requisitos android studio https //developer android com/studio ou vs code instalado (com plugins dart e flutter) um app criado no back4app nota siga o tutorial de novo app parse para aprender como criar um app parse no back4app um app flutter conectado ao back4app nota siga o instalar o sdk parse no projeto flutter para criar um projeto flutter conectado ao back4app um dispositivo (ou dispositivo virtual) executando android ou ios objetivo explore a querybuilder querybuilder classe diferentes métodos a classe querybuilder qualquer operação de consulta parse usa o querybuilder querybuilder tipo de objeto, que ajudará você a recuperar dados específicos do seu banco de dados ao longo do seu aplicativo para criar um novo querybuilder querybuilder , você precisa passar como parâmetro a desejada parseobject parseobject subclasse, que é a que conterá os resultados da sua consulta é crucial saber que um querybuilder querybuilder só será resolvido após chamar um método de recuperação query query , então uma consulta pode ser configurada e vários modificadores podem ser encadeados antes de realmente serem chamados você pode ler mais sobre a classe querybuilder aqui na documentação oficial usando o console javascript no back4app dentro do painel da sua aplicação back4app, você encontrará um console de api muito útil no qual pode executar código javascript diretamente neste guia, você usará para armazenar objetos de dados no back4app no painel principal do seu app, vá para core >api console >javascript core >api console >javascript salve seus objetos de dados para executar as consultas neste guia, você precisará primeiro preencher seu app com alguns dados vamos criar uma classe de exemplo chamada perfil perfil , que simula uma classe de perfil de mídia social usando nomes de pessoas famosas e os seguintes campos tipo de string nome nome tipo de data datadenascimento datadenascimento tipo de número (inteiro) contagemdeamigos contagemdeamigos tipo de array (lista de strings) comidasfavoritas comidasfavoritas tipo de array (lista de números) númerosdasorte númerosdasorte tipo geopoint localizaçãodoúltimologin localizaçãodoúltimologin aqui está o parse object parse object código de criação das classes, então vá em frente e execute o no seu console da api 1 // add profile objects and create table 2 // adam sandler 3 let profile = new parse object('profile'); 4 profile set('name', 'adam sandler'); 5 profile set('birthday', new date('09/09/1966')); 6 profile set('friendcount', 2); 7 profile set('favoritefoods', \['lobster', 'bread']); 8 profile set('luckynumbers', \[2, 7]); 9 profile set('lastloginlocation', new parse geopoint(37 38412167489413, 122 01268034622319)); 10 await profile save(); 11 12 // britney spears 13 profile = new parse object('profile'); 14 profile set('name', 'britney spears'); 15 profile set('birthday', new date('12/02/1981')); 16 profile set('friendcount', 52); 17 profile set('favoritefoods', \['cake', 'bread']); 18 profile set('luckynumbers', \[22, 7]); 19 profile set('lastloginlocation', new parse geopoint(37 38412167489413, 122 01268034622319)); 20 await profile save(); 21 22 // carson kressley 23 profile = new parse object('profile'); 24 profile set('name', 'carson kressley'); 25 profile set('birthday', new date('11/11/1969')); 26 profile set('friendcount', 12); 27 profile set('favoritefoods', \['fish', 'cookies']); 28 profile set('luckynumbers', \[8, 2]); 29 profile set('lastloginlocation', new parse geopoint(37 38412167489413, 122 01268034622319)); 30 await profile save(); 31 32 // dan aykroyd 33 // creates related object membership for this user only 34 let membership = new parse object('membership'); 35 membership set('name', 'premium'); 36 membership set('expirationdate', new date('10/10/2030')) 37 await membership save(); 38 39 profile = new parse object('profile'); 40 profile set('name', 'dan aykroyd'); 41 profile set('birthday', new date('07/01/1952')); 42 profile set('friendcount', 66); 43 profile set('favoritefoods', \['jam', 'peanut butter']); 44 profile set('luckynumbers', \[22, 77]); 45 profile set('lastloginlocation', new parse geopoint(37 38412167489413, 122 01268034622319)); 46 profile set('premiummembership', membership); 47 await profile save(); 48 49 // eddie murphy 50 profile = new parse object('profile'); 51 profile set('name', 'eddie murphy'); 52 profile set('birthday', new date('04/03/1961')); 53 profile set('friendcount', 49); 54 profile set('favoritefoods', \['lettuce', 'pepper']); 55 profile set('luckynumbers', \[6, 5]); 56 profile set('lastloginlocation', new parse geopoint( 27 104919974838154, 52 61428045237739)); 57 await profile save(); 58 59 // fergie 60 profile = new parse object('profile'); 61 profile set('name', 'fergie'); 62 profile set('birthday', new date('03/27/1975')); 63 profile set('friendcount', 55); 64 profile set('favoritefoods', \['lobster', 'shrimp']); 65 profile set('luckynumbers', \[13, 7]); 66 profile set('lastloginlocation', new parse geopoint( 27 104919974838154, 52 61428045237739)); 67 await profile save(); 68 69 console log('success!'); após executar este código, você deve agora ter uma perfil perfil classe em seu banco de dados com seis objetos criados sua nova classe deve parecer com isso vamos agora dar uma olhada em exemplos de cada querybuilder querybuilder método, juntamente com breves explicações sobre o que eles fazem por favor, note que alguns métodos nesta lista podem aceitar opções opções como um argumento adicional, mas na maioria dos casos, isso está relacionado apenas ao masterkey masterkey uso e não é relevante para o conteúdo deste guia, então essa possibilidade será omitida sempre que não for relevante consultores de consulta esses métodos são responsáveis por executar a consulta e recuperar seus resultados, estando sempre presentes na implementação da sua consulta count //retrieves the count of parseobject results that meet the query criteria 1 querybuilder\<parseobject> querybuilder = querybuilder\<parseobject>(parseobject('profile')); 2 var apiresponse = await queryplayers count(); 3 if (apiresponse success && apiresponse result != null) { 4 int countgames = apiresponse count; 5 } getobject //this quick method is used to retrieve a single parseobject instance when you know its objectid 1 ///to retrieve one object of a class it is not necessary to create a parsequery 2 ///we can query using parseobject 3 final apiresponse = await parseobject('profile') getobject('c6endlnfdq'); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var o in apiresponse results) { 7 final object = o as parseobject; 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } getall //retrieves a complete list of parseobjects 1 ///to retrieve all objects of a class it is not necessary to create a parsequery 2 ///we can query using parseobject 3 final apiresponse = await parseobject('profile') getall(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var o in apiresponse results) { 7 final object = o as parseobject; 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } query //this is the basic method for retrieving your query results, always returning an list of parseobject instances, being empty when none are found 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 // when using query() in a query without other operations, you will 3 // get every object saved in your class 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var o in apiresponse results) { 8 final object = o as parseobject; 9 print('${object objectid} ${object get\<string>('name')}'); 10 } 11 } condicionadores de consulta esses métodos oferecem a possibilidade de aplicar restrições condicionais à sua consulta, que são, sem dúvida, as operações mais importantes na consulta lembre se de que todas essas operações podem ser encadeadas antes que os resultados sejam recuperados, então muitas combinações podem ser alcançadas para resolver suas necessidades de consulta wheredoesnotmatchkeyinquery //requires that a key’s value does not match a value in an object returned by a different parse query useful for multi object querying 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wheredoesnotmatchkeyinquery( 3 'friendcount', 4 'friendcount', 5 querybuilder\<parseobject>(parseobject('profile')) 6 wherelessthan('friendcount', 50)); 7 parsequery wheregreaterthan('friendcount', 10); 8 final apiresponse = await parsequery query(); 9 10 if (apiresponse success && apiresponse results != null) { 11 for (var object in apiresponse results as list\<parseobject>) { 12 print('${object objectid} name ${object get\<string>('name')} friendcount ${object get\<int>('friendcount')}'); 13 } 14 } wherearraycontainsall //filters objects in which an array type key value must contain every value provided 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherearraycontainsall('luckynumbers', \[2, 7]); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 print('${object objectid} ${object get\<string>('name')}'); 8 } 9 } wherecoitainedin //filters objects in which a key value is contained in the provided array of values 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherecontainedin('luckynumbers', \[2, 7]); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 print('${object objectid} ${object get\<string>('name')}'); 8 } 9 } wherecontains //filters objects in which a string key value contains the provided text value be aware that this condition is case sensitive 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 // this can be slow in large databases 3 parsequery wherecontains('name', 'an'); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var object in apiresponse results as list\<parseobject>) { 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } wheredoesnotmatchquery //requires that an object contained in the given key does not match another query useful for multi object querying 1 final querybuilder\<parseobject> innerquery = querybuilder\<parseobject>(parseobject('membership')); 2 innerquery wheregreaterthan('expirationdate', datetime now()); 3 4 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 5 6 parsequery wheredoesnotmatchquery('premiummembership', innerquery); 7 8 final apiresponse = await parsequery query(); 9 10 if (apiresponse success && apiresponse results != null) { 11 for (var object in apiresponse results as list\<parseobject>) { 12 print('${object objectid} name ${object get\<string>('name')}'); 13 } 14 } whereendswith //filters objects where specific key’s value ends with value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery whereendswith('name', 'ie'); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var o in apiresponse results) { 8 final object = o as parseobject; 9 print('${object objectid} ${object get\<string>('name')}'); 10 } 11 } whereequalto //filters objects in which a specific key’s value is equal to the provided value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery whereequalto('friendcount', 2); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var o in apiresponse results) { 8 final object = o as parseobject; 9 print('${object objectid} ${object get\<string>('name')}'); 10 } 11 } wheregreaterthan //filters objects in which a specific key’s value is greater than the provided value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery wheregreaterthan('birthday', datetime(1980, 08, 19)); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var object in apiresponse results as list\<parseobject>) { 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } wheregreaterthanorequalsto //filters objects in which a specific key’s value is greater than or equal to the provided value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery wheregreaterthanorequalsto('friendcount', 49); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var object in apiresponse results as list\<parseobject>) { 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } wherelessthan //filters objects in which a specific key’s value is lesser than the provided value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery wherelessthan('birthday', datetime(1980, 08, 19)); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var object in apiresponse results as list\<parseobject>) { 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } wherelessthanorequalto //filters objects in which a specific key’s value is lesser than or equal to the provided value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery wherelessthanorequalto('friendcount', 49); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var object in apiresponse results as list\<parseobject>) { 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } wherematcheskeyinquery //requires that a key’s value matches a value in an object returned by a different parse query useful for multi object querying 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherematcheskeyinquery( 3 'friendcount', 4 'friendcount', 5 querybuilder\<parseobject>(parseobject('profile')) 6 wherelessthan('friendcount', 50)); 7 8 final apiresponse = await parsequery query(); 9 10 if (apiresponse success && apiresponse results != null) { 11 for (var object in apiresponse results as list\<parseobject>) { 12 print('${object objectid} name ${object get\<string>('name')} friendcount ${object get\<int>('friendcount')}'); 13 } 14 } wherematchesquery //requires that an object contained in the given key matches another query useful for multi object querying 1 final querybuilder\<parseobject> innerquery = querybuilder\<parseobject>(parseobject('membership')); 2 innerquery wheregreaterthan('expirationdate', datetime now()); 3 4 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 5 6 parsequery wherevalueexists('premiummembership', true); 7 parsequery wherematchesquery('premiummembership', innerquery); 8 9 final apiresponse = await parsequery query(); 10 11 if (apiresponse success && apiresponse results != null) { 12 for (var object in apiresponse results as list\<parseobject>) { 13 print('${object objectid} name ${object get\<string>('name')}'); 14 } 15 } wherenotcontainedin //filters objects in which a key value is not contained in the provided array of values 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherenotcontainedin('luckynumbers', \[2, 7]); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 print('${object objectid} ${object get\<string>('name')}'); 8 } 9 } wherenotequalto //filters objects in which a specific key’s value is not equal to the provided value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery wherenotequalto('friendcount', 2); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var object in apiresponse results as list\<parseobject>) { 8 print('${object objectid} ${object get\<string>('name')}'); 9 } 10 } wherestartswith //filters objects where specific key’s value starts with value 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 3 parsequery wherestartswith('name', 'adam'); 4 final apiresponse = await parsequery query(); 5 6 if (apiresponse success && apiresponse results != null) { 7 for (var o in apiresponse results) { 8 final object = o as parseobject; 9 print('${object objectid} ${object get\<string>('name')}'); 10 } 11 } wherevalueexists //filters objects in which a key value is set or no 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 //true retrieve documents with field set 3 //false retrieve documents without field set 4 parsequery wherevalueexists('premiummembership', true); 5 final apiresponse = await parsequery query(); 6 7 if (apiresponse success && apiresponse results != null) { 8 for (var object in apiresponse results as list\<parseobject>) { 9 print('${object objectid} ${object get\<string>('name')}'); 10 } 11 } ordenação de consultas essencial na maioria das consultas, a ordenação pode ser facilmente alcançada no parse e até encadeada entre duas ou mais restrições de ordenação orderbyascending //sort the results in ascending order, this can be chained without overwriting previous orderings multiple keys can be used to solve ordering ties 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery orderbyascending('name'); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 print('${object objectid} ${object get\<string>('name')}'); 8 } 9 } orderbydescending //sort the results in descending order, this can be chained without overwriting previous orderings multiple keys can be used to solve ordering ties 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery orderbydescending('name'); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 print('${object objectid} ${object get\<string>('name')}'); 8 } 9 } seleção de campo esses métodos afetam quais valores de campo podem estar nos resultados da sua consulta excludekeys //return all fields in the returned objects except the ones specified 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery excludekeys(\['name']); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 //name = null 8 print('${object objectid} name ${object get\<string>('name')} birthday ${object get\<datetime>('birthday')}'); 9 } 10 } includeobject //includes nested parseobjects for the provided key 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery includeobject(\['premiummembership']); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 //name = null 8 print('${object objectid} name ${object get\<string>('name')} premiummembership ${object get\<parseobject>('premiummembership') tostring()}'); 9 } 10 } keystoreturn //return only the specified fields in the returned objects 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery keystoreturn(\['name']); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 //birthday = null 8 print('${object objectid} name ${object get\<string>('name')} birthday ${object get\<datetime>('birthday')}'); 9 } 10 } consulta de geopoint estes são métodos específicos para consultas geopoint wherenear //return all fields in the returned objects except the ones specified 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherenear( 3 'lastloginlocation', 4 parsegeopoint(latitude 37 38412167489413, longitude 122 01268034622319) 5 ); 6 7 final apiresponse = await parsequery query(); 8 9 if (apiresponse success && apiresponse results != null) { 10 for (var object in apiresponse results as list\<parseobject>) { 11 print('${object objectid} name ${object get\<string>('name')} geopoint ${object get\<parsegeopoint>('lastloginlocation') tojson()}'); 12 } 13 } wherewithingeobox 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherewithingeobox( 3 'lastloginlocation', 4 parsegeopoint(latitude 37 38412167489413, longitude 122 01268034622319), 5 parsegeopoint(latitude 37 28412167489413, longitude 121 91268034622319) 6 ); 7 8 final apiresponse = await parsequery query(); 9 10 if (apiresponse success && apiresponse results != null) { 11 for (var object in apiresponse results as list\<parseobject>) { 12 print('${object objectid} name ${object get\<string>('name')} geopoint ${object get\<parsegeopoint>('lastloginlocation') tojson()}'); 13 } 14 } wherewithinkilometers 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherewithinkilometers( 3 'lastloginlocation', 4 parsegeopoint(latitude 37 38412167489413, longitude 122 01268034622319), 5 100 6 ); 7 8 final apiresponse = await parsequery query(); 9 10 if (apiresponse success && apiresponse results != null) { 11 for (var object in apiresponse results as list\<parseobject>) { 12 print('${object objectid} name ${object get\<string>('name')} geopoint ${object get\<parsegeopoint>('lastloginlocation') tojson()}'); 13 } 14 } wherewithinmiles 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherewithinmiles( 3 'lastloginlocation', 4 parsegeopoint(latitude 37 38412167489413, longitude 122 01268034622319), 5 100 6 ); 7 8 final apiresponse = await parsequery query(); 9 10 if (apiresponse success && apiresponse results != null) { 11 for (var object in apiresponse results as list\<parseobject>) { 12 print('${object objectid} name ${object get\<string>('name')} geopoint ${object get\<parsegeopoint>('lastloginlocation') tojson()}'); 13 } 14 } wherewithinradians 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery wherewithinradians( 3 'lastloginlocation', 4 parsegeopoint(latitude 37 38412167489413, longitude 122 01268034622319), 5 100 6 ); 7 8 final apiresponse = await parsequery query(); 9 10 if (apiresponse success && apiresponse results != null) { 11 for (var object in apiresponse results as list\<parseobject>) { 12 print('${object objectid} name ${object get\<string>('name')} geopoint ${object get\<parsegeopoint>('lastloginlocation') tojson()}'); 13 } 14 } paginação esses métodos estão relacionados a utilitários de paginação, úteis para consultas que recuperarão um grande número de resultados setamounttoskip 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery setamounttoskip(2); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 print('${object objectid} name ${object get\<string>('name')}'); 8 } 9 } setlimit 1 final querybuilder\<parseobject> parsequery = querybuilder\<parseobject>(parseobject('profile')); 2 parsequery setlimit(2); 3 final apiresponse = await parsequery query(); 4 5 if (apiresponse success && apiresponse results != null) { 6 for (var object in apiresponse results as list\<parseobject>) { 7 print('${object objectid} name ${object get\<string>('name')}'); 8 } 9 } consulta composta esses métodos criarão consultas compostas, que podem combinar mais de uma instância de parsequery para obter resultados mais complexos or //compose a compound query that is the or of the passed queries 1 final querybuilder\<parseobject> query1 = querybuilder\<parseobject>(parseobject('profile')); 2 query1 wheregreaterthan('friendcount', 10); 3 4 final querybuilder\<parseobject> query2 = querybuilder\<parseobject>(parseobject('profile')); 5 query2 wherelessthan('friendcount', 50); 6 7 querybuilder\<parseobject> mainquery = querybuilder or( 8 parseobject("profile"), 9 \[query1, query2], 10 ); 11 12 final apiresponse = await mainquery query(); 13 14 if (apiresponse success && apiresponse results != null) { 15 for (var object in apiresponse results as list\<parseobject>) { 16 print('${object objectid} name ${object get\<string>('name')}'); 17 } 18 } conclusão no final deste guia, você aprendeu como realizar cada método de consulta de dados no parse no próximo guia, você aprenderá sobre consultas complexas no parse em flutter