Tipos de Datos en Parse Server para Android: Guía Completa
24 min
tipos de datos de parse en android introducción en esta guía, aprenderás sobre los tipos de datos de parse utilizando android leerás y guardarás los objetos de parse en back4app desde una aplicación de android almacenar datos en parse se basa en el \<font color="#2166ae">parseobject\</font> cada \<font color="#2166ae">parseobject\</font> contiene pares clave valor de datos compatibles con json estos datos no tienen esquema, lo que significa que no necesitamos especificar de antemano qué claves existen en cada \<font color="#2166ae">parseobject\</font> podemos establecer los pares clave valor que queramos, y nuestro backend los almacenará por ejemplo, digamos que estamos rastreando las puntuaciones más altas de un juego un solo \<font color="#2166ae">parseobject\</font> podría contener 1 puntuación 1337 , nombredeljugador "sean plott" , modotrampa falso las claves deben ser cadenas alfanuméricas, y los valores pueden ser \<font color="#2166ae">cadena\</font> => \<font color="#2166ae">cadena\</font> \<font color="#2166ae">número\</font> (valores numéricos primitivos como \<font color="#2166ae">int\</font> , \<font color="#2166ae">double\</font> ) \<font color="#2166ae">bool\</font> => \<font color="#2166ae">booleano\</font> \<font color="#2166ae">datetime\</font> => java util date \<font color="#2166ae">nulo\</font> => jsonobject null \<font color="#2166ae">array\</font> =>jsonarray \<font color="#2166ae">archivo\</font> => parse file \<font color="#2166ae">puntero\</font> => otro parseobject \<font color="#2166ae">relación\</font> => parserelation \<font color="#2166ae">geopunto\</font> => parsegeopoint cada \<font color="#2166ae">parseobject\</font> tiene un nombre de clase que podemos usar para distinguir diferentes tipos de datos por ejemplo, podríamos llamar al objeto de puntuación alta un \<font color="#2166ae">gamescore\</font> también hay algunos campos que no necesitamos especificar que se proporcionan como una conveniencia \<font color="#2166ae">objectid\</font> es un identificador único para cada objeto guardado \<font color="#2166ae">createdat\</font> y \<font color="#2166ae">updatedat\</font> representan el momento en que cada objeto fue creado y modificado por última vez en la nube cada uno de estos campos se completa automáticamente por back4app en el momento en que guardamos un nuevo \<font color="#2166ae">parseobject\</font> te recomendamos que \<font color="#2166ae">nameyourclasseslikethis\</font> (uppercamelcase) y \<font color="#2166ae">nameyourkeyslikethis \</font> (lowercamelcase), solo para mantener tu código bonito este tutorial utiliza una aplicación básica creada en android studio 4 1 1 con \<font color="#2166ae">buildtoolsversion=30 0 2\</font> , \<font color="#2166ae">compile sdk version\</font> = \<font color="#2166ae">30 0 2\</font> y \<font color="#2166ae">targetsdkversion 30\</font> en cualquier momento, puedes acceder al proyecto completo a través de nuestros repositorios de github repositorio de ejemplo en kotlin https //github com/templates back4app/android crud operations kotlin repositorio de ejemplo en java https //github com/templates back4app/android crud operations java objetivo nuestro objetivo es crear una aplicación de android que pueda procesar todos los tipos de datos proporcionados por parse server aquí hay una vista previa de lo que vamos a lograr requisitos previos para completar este tutorial, necesitamos android studio https //developer android com/studio/index html una aplicación creada en back4app nota sigue el tutorial de nueva aplicación parse https //www back4app com/docs/get started/new parse app para aprender cómo crear una aplicación parse en back4app una aplicación de android conectada a back4app nota sigue el tutorial de instalación del sdk de parse https //www back4app com/docs/android/parse android sdk para crear un proyecto de android studio conectado a back4app un dispositivo (o dispositivo virtual https //developer android com/studio/run/managing avds html ) que ejecute android 4 1 (jelly bean) o superior entendiendo nuestra aplicación crearás una aplicación para una mejor comprensión de parse \<font color="#2166ae">tipos de datos\</font> en esta \<font color="#2166ae">android\</font> aplicación, crearás todos los tipos de datos en una clase llamada \<font color="#2166ae">datatypes\</font> y asignarás valores a las variables de esta clase luego leeremos y actualizaremos estos datos nota los tipos de datos \<font color="#2166ae">puntero\</font> , \<font color="#2166ae">relación\</font> , \<font color="#2166ae">archivo\</font> , \<font color="#2166ae">geopunto\</font> se cubrirán más adelante en guías específicas ¡comencemos! 1 crear plantilla de aplicación define las siguientes variables en el \<font color="#2166ae">mainactivity\</font> y reemplaza el código en el \<font color="#2166ae">oncreate\</font> método con el siguiente código 1 private progressdialog progressdialog; 2 private view popupinputdialogview; 3 private recyclerview recyclerview; 4 private string objectid; 5 private static final string tag = "mainactivity"; 6 7 @override 8 protected void oncreate(bundle savedinstancestate) { 9 super oncreate(savedinstancestate); 10 setcontentview(r layout activity main); 11 12 progressdialog = new progressdialog(mainactivity this); 13 14 button savedata = findviewbyid(r id savedata); 15 button readdata = findviewbyid(r id readdata); 16 button updatedata = findviewbyid(r id updatedata); 17 18 savedata setonclicklistener(savedataview > { 19 try { 20 savedatatypes(); 21 } catch (jsonexception e) { 22 e printstacktrace(); 23 } 24 }); 25 26 readdata setonclicklistener(readdataview > readobjects()); 27 28 updatedata setonclicklistener(updatedataview > updateobject()); 29 30 }1 private var progressdialog progressdialog? = null 2 private var objectid string? = null 3 private var popupinputdialogview view? = null 4 private var recyclerview recyclerview? = null 5 private val tag = "mainactivity" 6 7 override fun oncreate(savedinstancestate bundle?) { 8 super oncreate(savedinstancestate) 9 setcontentview(r layout activity main) 10 11 progressdialog = progressdialog(this\@mainactivity) 12 val savedata = findviewbyid\<button>(r id savedata) 13 val readdata = findviewbyid\<button>(r id readdata) 14 val updatedata = findviewbyid\<button>(r id updatedata) 15 16 savedata setonclicklistener { 17 try { 18 savedatatypes() 19 } catch (e jsonexception) { 20 e printstacktrace() 21 } 22 } 23 readdata setonclicklistener { readobjects() } 24 updatedata setonclicklistener { updateobject() } 25 } antes de los siguientes pasos, necesitamos conectar \<font color="#2166ae">back4app\</font> a nuestra aplicación debes guardar el \<font color="#2166ae">appid\</font> y \<font color="#2166ae">clientkey\</font> de \<font color="#2166ae">back4app\</font> al archivo \<font color="#2166ae">string xml\</font> y luego inicializa \<font color="#2166ae">parse\</font> en nuestro archivo \<font color="#2166ae">app java\</font> o \<font color="#2166ae">app kt\</font> sigue el nuevo tutorial de parse app https //www back4app com/docs/android/parse android sdk si no sabes cómo inicializar \<font color="#2166ae">parse\</font> en tu aplicación 2 código para guardar objeto la función de creación creará un nuevo objeto en la base de datos de back4app definimos la \<font color="#2166ae">savedatatypes\</font> función que llamamos en la \<font color="#2166ae">oncreate\</font> función y usamos el siguiente código en esta función guardaremos todos los tipos de datos con esta función en el objeto de clases datatypes 1 private void savedatatypes() throws jsonexception{ 2 parseobject parseobject = new parseobject("datatypes"); 3 4 parseobject put("stringfield", "string"); 5 parseobject put("doublefield", 1 5); 6 parseobject put("intfield", 2); 7 parseobject put("boolfield", true); 8 parseobject put("datefield", calendar getinstance() gettime()); 9 10 jsonobject myobject = new jsonobject(); 11 myobject put("number", 1); 12 myobject put("string", "42"); 13 14 parseobject put("jsonobject", myobject); 15 16 17 jsonarray myarray = new jsonarray(); 18 myarray put(myobject); 19 myarray put(myobject); 20 myarray put(myobject); 21 22 parseobject put("jsonarray", myarray); 23 24 25 list\<string> list = new arraylist<>(); 26 list add("string1"); 27 list add("string2"); 28 parseobject put("liststringfield", list); 29 30 list\<integer> listint = new arraylist<>(); 31 listint add(1); 32 listint add(2); 33 listint add(3); 34 parseobject put("listintfield", listint); 35 36 list\<boolean> listbool = new arraylist<>(); 37 listbool add(true); 38 listbool add(false); 39 parseobject put("listboolfield", listbool); 40 41 progressdialog show(); 42 parseobject saveinbackground(e > { 43 progressdialog dismiss(); 44 if (e == null) { 45 toast maketext(this, "object created successfully ", toast length short) show(); 46 objectid = parseobject getobjectid(); 47 } else { 48 objectid = null; 49 toast maketext(this, e getmessage(), toast length long) show(); 50 } 51 }); 52 }1 private fun savedatatypes() { 2 val parseobject = parseobject("datatypes") 3 4 parseobject put("stringfield", "string") 5 parseobject put("doublefield", 1 5) 6 parseobject put("intfield", 2) 7 parseobject put("boolfield", true) 8 parseobject put("datefield", calendar getinstance() time) 9 10 11 val myobject = jsonobject() 12 myobject put("number", 1) 13 myobject put("string", "42") 14 15 parseobject put("jsonobject", myobject) 16 17 val myarray = jsonarray() 18 myarray put(myobject) 19 myarray put(myobject) 20 myarray put(myobject) 21 22 parseobject put("jsonarray", myarray) 23 24 val list mutablelist\<string> = arraylist() 25 list add("string1") 26 list add("string2") 27 parseobject put("liststringfield", list) 28 29 val listint mutablelist\<int> = arraylist() 30 listint add(1) 31 listint add(2) 32 listint add(3) 33 parseobject put("listintfield", listint) 34 35 val listbool mutablelist\<boolean> = arraylist() 36 listbool add(true) 37 listbool add(false) 38 parseobject put("listboolfield", listbool) 39 40 progressdialog? show() 41 parseobject saveinbackground { 42 progressdialog? dismiss() 43 if (it == null) { 44 toast maketext(this, "object created successfully ", toast length short) show() 45 objectid = parseobject objectid 46 } else { 47 objectid = null 48 toast maketext(this, it message, toast length long) show() 49 } 50 } 51 } 3 código para leer objeto daremos la \<font color="#2166ae">objectid\</font> variable que hemos asignado en la \<font color="#2166ae">savedatatypes\</font> función como un parámetro a la consulta y leeremos los datos que hemos guardado en la \<font color="#2166ae">savedatatypes\</font> función con la \<font color="#2166ae">readobjects\</font> función 1 private void readobjects() { 2 if (objectid == null) { 3 toast maketext(this, "no object click on the 'save data' button before ", toast length short) show(); 4 return; 5 } 6 7 parsequery\<parseobject> query = new parsequery<>("datatypes"); 8 9 progressdialog show(); 10 query getinbackground(objectid, (object, e) > { 11 progressdialog dismiss(); 12 if (e == null) { 13 list\<data> list = new arraylist<>(); 14 list add(new data("int list field",object get("listintfield") tostring())); 15 list add(new data("string field",object get("stringfield") tostring())); 16 list add(new data("double field",object get("doublefield") tostring())); 17 list add(new data("int field",object get("intfield") tostring())); 18 list add(new data("string list field",object get("liststringfield") tostring())); 19 list add(new data("date field",object get("datefield") tostring())); 20 list add(new data("bool field",object get("boolfield") tostring())); 21 list add(new data("list bool field",object get("listboolfield") tostring())); 22 list add(new data("json object field",object get("jsonobject") tostring())); 23 list add(new data("json array field",object get("jsonarray") tostring())); 24 25 showdatatypes(list); 26 27 } else { 28 toast maketext(this, e getmessage(), toast length short) show(); 29 } 30 }); 31 }1 private fun readobjects() { 2 if (objectid == null) { 3 toast maketext( 4 this, 5 "no object click on the 'save data' button before ", 6 toast length short 7 ) show() 8 return 9 } 10 11 val query = parsequery\<parseobject>("datatypes") 12 13 14 progressdialog? show() 15 query getinbackground( 16 objectid 17 ) { obj, e > 18 progressdialog? dismiss() 19 if (e == null) { 20 21 val list mutablelist\<data> = arraylist() 22 list add(data("int list field", obj get("listintfield") tostring())) 23 list add(data("string field",obj get("stringfield") tostring())) 24 list add(data("double field", obj get("doublefield") tostring())) 25 list add(data("int field", obj get("intfield") tostring())) 26 list add(data("string list field", obj get("liststringfield") tostring())) 27 list add(data("date field",obj get("datefield") tostring())) 28 list add(data("bool field", obj get("boolfield") tostring())) 29 list add(data("list bool field", obj get("listboolfield") tostring())) 30 list add(data("json object field", obj get("jsonobject") tostring())) 31 list add(data("json array field", obj get("jsonarray") tostring())) 32 showdatatypes(list) 33 } else { 34 toast maketext(this, e message, toast length short) show() 35 } 36 37 } 38 } en esta sección, hemos creado una clase modelo llamada \<font color="#2166ae">datos\</font> usamos los datos que obtenemos en la \<font color="#2166ae">leerobjetos\</font> función para crear objetos de esta clase modelo damos estos objetos como elementos a la lista que creamos en \<font color="#2166ae">datos\</font> tipo luego damos esta lista como un parámetro a la \<font color="#2166ae">mostrartiposdedatos\</font> función y la listamos en el \<font color="#2166ae">alertdialog\</font> este es el \<font color="#2166ae">data\</font> modelo 1 public class data { 2 private string type; 3 private string value; 4 5 public data(string type, string value) { 6 this type = type; 7 this value = value; 8 } 9 10 public string gettype() { 11 return type; 12 } 13 14 public data settype(string type) { 15 this type = type; 16 return this; 17 } 18 19 public string getvalue() { 20 return value; 21 } 22 23 public data setvalue(string value) { 24 this value = value; 25 return this; 26 } 27 }1 class data(val type\ string?=null,val value\ string?=null) { 2 3 } esta es la \<font color="#2166ae">showdatatypes\</font> función 1 private void showdatatypes(list\<data> list){ 2 alertdialog builder alertdialogbuilder = new alertdialog builder(mainactivity this); 3 alertdialogbuilder settitle("data types"); 4 alertdialogbuilder setcancelable(true); 5 initpopupviewcontrols(list); 6 //we are setting our custom popup view by alertdialog builder 7 alertdialogbuilder setview(popupinputdialogview); 8 final alertdialog alertdialog = alertdialogbuilder create(); 9 alertdialog show(); 10 } 11 12 private void initpopupviewcontrols(list\<data> list) { 13 layoutinflater layoutinflater = layoutinflater from(mainactivity this); 14 popupinputdialogview = layoutinflater inflate(r layout custom alert dialog, null); 15 recyclerview = popupinputdialogview\ findviewbyid(r id recyclerview); 16 itemadapter adapter = new itemadapter(list,this); 17 recyclerview\ setlayoutmanager(new linearlayoutmanager(this,linearlayoutmanager vertical,false)); 18 recyclerview\ setadapter(adapter); 19 }1 private fun showdatatypes(list list\<data>) { 2 val alertdialogbuilder = alertdialog builder(this\@mainactivity) 3 alertdialogbuilder settitle("data types") 4 alertdialogbuilder setcancelable(true) 5 initpopupviewcontrols(list) 6 //we are setting our custom popup view by alertdialog builder 7 alertdialogbuilder setview(popupinputdialogview) 8 val alertdialog = alertdialogbuilder create() 9 alertdialog show() 10 } 11 12 @suppresslint("inflateparams") 13 private fun initpopupviewcontrols(list list\<data>) { 14 val layoutinflater = layoutinflater from(this\@mainactivity) 15 popupinputdialogview = layoutinflater inflate(r layout custom alert dialog, null) 16 recyclerview = popupinputdialogview? findviewbyid(r id recyclerview) 17 val adapter = itemadapter(this\@mainactivity, list) 18 recyclerview? layoutmanager = linearlayoutmanager( 19 this, 20 linearlayoutmanager vertical, 21 false 22 ) 23 recyclerview? adapter = adapter 24 } 4 código para actualizar objeto la \<font color="#2166ae">updateobject\</font> función es responsable de actualizar los datos en el objeto creado en la \<font color="#2166ae">savedatatypes\</font> función estamos usando \<font color="#2166ae">objectid\</font> nuevamente para actualizar el objeto 1 public void updateobject() { 2 if (objectid == null) { 3 toast maketext(this, "no object click on the 'save data' button before ", toast length short) show(); 4 return; 5 } 6 7 parseobject parseobject = new parseobject("datatypes"); 8 parseobject setobjectid(objectid); 9 parseobject put("intfield", 5); 10 parseobject put("stringfield", "new string"); 11 12 progressdialog show(); 13 14 parseobject saveinbackground(e > { 15 progressdialog dismiss(); 16 if (e == null) { 17 toast maketext(this, "object updated successfully ", toast length short) show(); 18 } else { 19 toast maketext(this, e getmessage(), toast length short) show(); 20 } 21 }); 22 }1 private fun updateobject() { 2 if (objectid == null) { 3 toast maketext( 4 this, 5 "no object click on the 'save data' button before ", 6 toast length short 7 ) show() 8 return 9 } 10 11 val parseobject = parseobject("datatypes") 12 parseobject objectid = objectid 13 parseobject put("intfield", 5) 14 parseobject put("stringfield", "new string") 15 16 progressdialog? show() 17 18 parseobject saveinbackground { 19 progressdialog? dismiss() 20 if (it == null) { 21 toast maketext(this, "object updated successfully ", toast length short) show() 22 } else { 23 toast maketext(this, it message, toast length short) show() 24 } 25 } 26 } 5 usando contadores el ejemplo anterior contiene un caso de uso común el \<font color="#2166ae">intfield\</font> campo puede ser un contador que necesitaremos actualizar continuamente la solución anterior funciona, pero es engorrosa y puede llevar a problemas si tenemos múltiples clientes tratando de actualizar el mismo contador parse proporciona métodos que incrementan atómicamente cualquier campo numérico para ayudar con el almacenamiento de datos de tipo contador así que, la misma actualización puede reescribirse como 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject increment("intfield",1);1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject increment("intfield",1) 6 usando listas parse también proporciona métodos para ayudar a almacenar datos de lista hay tres operaciones que se pueden usar para cambiar un campo de lista de manera atómica \<font color="#2166ae">setadd\</font> y \<font color="#2166ae">setaddall\</font> agrega los objetos dados al final de un campo de matriz \<font color="#2166ae">setaddunique\</font> y \<font color="#2166ae">setaddallunique\</font> agrega solo los objetos dados que no están ya contenidos en un campo de matriz a ese campo la posición de la inserción no está garantizada \<font color="#2166ae">remove\</font> y \<font color="#2166ae">removeall\</font> elimina todas las instancias de los objetos dados de un campo de matriz 6 1 ejemplos con add y addall \<font color="#2166ae">liststringfield\</font> tiene el valor \["a","b","c","d","e","f","g","g"] ejecutando el código a continuación 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject add("liststringfield","e"); 4 parseobject addall("liststringfield", arrays aslist("e", "f", "g", "g")); 5 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject add("liststringfield", "e") 4 parseobject addall("liststringfield", arrays aslist("e", "f", "g", "g")) 5 parseobject save() después de este comando, el resultado del campo stringlist será \["a","b","c","d","e","e","f","g","g"] 6 2 ejemplos con addunique y addallunique \<font color="#2166ae">liststringfield\</font> tiene el valor \["a","b","c","d","e"] ejecutando el código a continuación 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject addunique("liststringfield","e"); 4 parseobject addallunique("liststringfield",arrays aslist("c", "d", "e", "f")); 5 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject addunique("liststringfield", "e") 4 parseobject addallunique("liststringfield", arrays aslist("c", "d", "e", "f")) 5 parseobject save() después de este comando, el resultado del \<font color="#2166ae">stringlist\</font> campo será \["a","b","c","d","e","f"] no se repitieron valores 6 3 ejemplos con removeall \<font color="#2166ae">liststringfield\</font> tiene el valor \["a","b","c","d","e","f"] ejecutando el código a continuación 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject removeall("liststringfield",arrays aslist("c", "d", "e", "f")); 4 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject removeall("liststringfield", arrays aslist("c", "d", "e", "f")) 4 parseobject save() después de este comando, el resultado del \<font color="#2166ae">stringlist\</font> campo será \["a","b"] nota que actualmente no es posible agregar y eliminar elementos de un array de manera atómica en la misma guardia tendremos que llamar a la guardia para cada operación de array diferente que queramos realizar por separado 7 eliminar un campo único de parseobject puedes eliminar un campo único de un objeto utilizando la \<font color="#2166ae">remove\</font> operación 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject remove("stringfield"); 3 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject remove("stringfield") 3 parseobject save() ¡está hecho! en este punto, hemos aprendido \<font color="#2166ae">tipos de datos de parse\</font> en \<font color="#2166ae">android\</font>