Android: Implementazione CRUD usando Parse con Kotlin e Java
13 min
crud parse oggetti in android introduzione in questa sezione costruiremo un'applicazione android che esegue operazioni crud di base crud è l'abbreviazione di create read update delete quando memorizzi i dati su parse, è costruito attorno a parseobject e ognuno di essi contiene coppie chiave valore di dati compatibili con json i valori che puoi memorizzare nel database back4app possono essere di tipo string, number, bool, array, object, date, file, pointer, relation e null puoi ottenere ulteriori informazioni sui tipi di dati cliccando qui https //docs parseplatform org/js/guide/#data types questo tutorial utilizza un'app di base creata in android studio 4 1 1 con \<font color="#2166ae">buildtoolsversion=30 0 2\</font> , \<font color="#2166ae">compile sdk version = 30 0 2\</font> e \<font color="#2166ae">targetsdkversion 30\</font> in qualsiasi momento, puoi accedere al progetto completo tramite i nostri repository github repository di esempio kotlin https //github com/templates back4app/android crud operations kotlin repository di esempio java https //github com/templates back4app/android crud operations java obiettivo ecco un'anteprima di ciò che stiamo per realizzare requisiti per completare questo tutorial, abbiamo bisogno di android studio https //developer android com/studio/index html un'app creata su back4app nota segui il tutorial nuova app parse https //www back4app com/docs/get started/new parse app per imparare a creare un'app parse su back4app un'app android collegata a back4app nota segui il tutorial installazione parse sdk https //www back4app com/docs/android/parse android sdk per creare un progetto android studio collegato a back4app un dispositivo (o dispositivo virtuale https //developer android com/studio/run/managing avds html ) che esegue android 4 1 (jelly bean) o versioni successive comprendere la nostra app todo per comprendere meglio parse su android, vedrai le operazioni crud implementate su un'app todo l'applicazione avrà un'interfaccia semplice, con un campo di testo per il titolo e la descrizione per registrare un'attività e un elenco di attività registrate puoi aggiornare il titolo o la descrizione di ciascuna attività nota in questo tutorial creeremo il nostro dialogo di avviso personalizzato pertanto, i codici saranno configurati per seguire il modello puoi adattarlo al tuo design se hai problemi, controlla i repository di github per kotlin https //github com/templates back4app/android crud operations kotlin e java https //github com/templates back4app/android crud operations java iniziamo! seguendo i passaggi successivi, sarai in grado di costruire un'app todo che memorizzerà i compiti nel database di back4app 1 crea il modello dell'app todo vai su android studio e trova \<font color="#2166ae">activity main xml\</font> file di layout dal progetto \<font color="#2166ae">(project/app/res/layout/activity main xml)\</font> e poi sostituisci il codice qui sotto con il tuo codice questo codice xml sarà il nostro \<font color="#2166ae">design di mainactivity\</font> e collegheremo queste viste alla nostra \<font color="#2166ae">mainactivity java\</font> classe e le utilizzeremo 1 \<?xml version="1 0" encoding="utf 8"?> 2 \<androidx constraintlayout widget constraintlayout xmlns\ android="http //schemas android com/apk/res/android" 3 xmlns\ app="http //schemas android com/apk/res auto" 4 xmlns\ tools="http //schemas android com/tools" 5 android\ layout width="match parent" 6 android\ layout height="match parent" 7 tools\ context=" mainactivity"> 8 9 \<! title >> 10 \<textview 11 android\ id="@+id/textview" 12 android\ layout width="0dp" 13 android\ layout height="wrap content" 14 android\ background="@color/blue 700" 15 android\ gravity="center horizontal" 16 android\ padding="24dp" 17 android\ text="todo list" 18 android\ textcolor="@color/white" 19 app\ layout constraintend toendof="parent" 20 app\ layout constraintstart tostartof="parent" 21 app\ layout constrainttop totopof="parent" /> 22 23 \<! we will open a pop up view when clicked to this button >> 24 \<com google android material floatingactionbutton floatingactionbutton 25 android\ id="@+id/fab" 26 style="@style/widget materialcomponents floatingactionbutton" 27 android\ layout width="wrap content" 28 android\ layout height="wrap content" 29 android\ layout margin="16dp" 30 android\ scaletype="centerinside" 31 android\ src="@drawable/ic baseline add 24" 32 app\ backgroundtint="@color/blue 700" 33 app\ fabsize="normal" 34 app\ layout constraintbottom tobottomof="parent" 35 app\ layout constraintend toendof="parent" 36 app\ tint="@color/white" /> 37 38 \<! we will show this text view when data list is empty >> 39 \<textview 40 android\ id="@+id/empty text" 41 android\ layout width="wrap content" 42 android\ layout height="wrap content" 43 android\ text="list is empty" 44 android\ layout margintop="32dp" 45 android\ textsize="20sp" 46 android\ visibility="gone" 47 app\ layout constraintend toendof="parent" 48 app\ layout constraintstart tostartof="parent" 49 app\ layout constrainttop tobottomof="@+id/textview" /> 50 51 \<! we will adapt the data list to this recyclerview > 52 \<androidx recyclerview\ widget recyclerview 53 android\ id="@+id/recyclerview" 54 android\ layout width="0dp" 55 android\ layout height="0dp" 56 app\ layout constraintbottom tobottomof="parent" 57 app\ layout constraintend toendof="parent" 58 app\ layout constraintstart tostartof="parent" 59 app\ layout constrainttop tobottomof="@+id/textview"> 60 \</androidx recyclerview\ widget recyclerview> 61 \</androidx constraintlayout widget constraintlayout> 2 crea oggetto la funzione di creazione creerà un nuovo compito con il titolo e la descrizione per aggiungere un todo, inseriamo i valori del titolo e della descrizione nel pop up che appare sullo schermo, lo impostiamo su parseobject e salviamo questo oggetto salviamo questo oggetto nel database utilizzando la funzione che parse ci ha fornito nota in questo progetto creeremo il nostro dialogo di avviso personalizzato puoi progettare il tuo dialogo di avviso come vuoi e impostarlo sulla vista del dialogo che utilizzerai in seguito 1 openinputpopupdialogbutton setonclicklistener(fabbuttonview > { 2 alertdialog builder alertdialogbuilder = new alertdialog builder(mainactivity this); 3 alertdialogbuilder settitle("create a todo"); 4 alertdialogbuilder setcancelable(true); 5 initpopupviewcontrols(); 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 savetodobutton setonclicklistener(savebuttonview > savetodo(alertdialog)); 11 canceluserdatabutton setonclicklistener(cancelbuttonview > alertdialog cancel()); 12 }); 13 14 //this is our savetodo function 15 private void savetodo(alertdialog alertdialog) { 16 parseobject todo = new parseobject("todo"); 17 if (titleinput gettext() tostring() length() != 0 && descriptioninput gettext() tostring() length() != 0) { 18 alertdialog cancel(); 19 progressdialog show(); 20 todo put("title", titleinput gettext() tostring()); 21 todo put("description", descriptioninput gettext() tostring()); 22 todo saveinbackground(e > { 23 progressdialog dismiss(); 24 if (e == null) { 25 //we saved the object and fetching data again 26 gettodolist(); 27 } else { 28 //we have an error we are showing error message here 29 showalert("error", e getmessage()); 30 } 31 }); 32 } else { 33 showalert("error", "please enter a title and description"); 34 } 35 }1 openinputpopupdialogbutton? setonclicklistener { fabbuttonview > 2 val alertdialogbuilder = alertdialog builder(this\@mainactivity) 3 alertdialogbuilder settitle("create a todo") 4 alertdialogbuilder setcancelable(true) 5 initpopupviewcontrols() 6 //we are setting our custom popup view by alertdialog builder 7 alertdialogbuilder setview(popupinputdialogview) 8 val alertdialog = alertdialogbuilder create() 9 alertdialog show() 10 savetodobutton? setonclicklistener { savebuttonview > 11 savedata(alertdialog) 12 } 13 canceluserdatabutton? setonclicklistener { cancelbuttonview > 14 alertdialog cancel() 15 } 16 } 17 18 //this is our savetodo function 19 private fun savedata(alertdialog alertdialog) { 20 val todo = parseobject("todo") 21 if (titleinput? text tostring() isnotempty() && descriptioninput? text tostring() isnotempty()) { 22 alertdialog cancel() 23 progressdialog? show() 24 todo put("title", titleinput? text tostring()) 25 todo put("description", descriptioninput? text tostring()) 26 todo saveinbackground { e > 27 progressdialog? dismiss() 28 if (e == null) { 29 //we saved the object and fetching data again 30 gettodolist() 31 } else { 32 //we have an error we are showing error message here 33 showalert("error", e message!!) 34 } 35 } 36 } else { 37 showalert("error", "please enter a title and description") 38 } 39 } 3 leggi oggetto con la funzione che parse ci ha fornito, possiamo recuperare tutti i dati in una classe come lista di parseobject creiamo una query come quella qui sotto e recuperiamo tutti i dati nella classe todo 1 private void gettodolist() { 2 progressdialog show(); 3 parsequery\<parseobject> query = parsequery getquery("todo"); 4 query orderbydescending("createdat"); 5 query findinbackground((objects, e) > { 6 progressdialog dismiss(); 7 if (e == null) { 8 //we are initializing todo object list to our adapter 9 inittodolist(objects); 10 } else { 11 showalert("error", e getmessage()); 12 } 13 }); 14 }1 private fun gettodolist() { 2 progressdialog? show() 3 val query = parsequery getquery\<parseobject>("todo") 4 query orderbydescending("createdat") 5 query findinbackground { objects, e > 6 progressdialog? dismiss() 7 if (e == null) { 8 //we are initializing todo object list to our adapter 9 inittodolist(objects) 10 } else { 11 showalert("error", e message!!) 12 } 13 } 14 } in questa funzione, diamo la lista restituita come parametro al nostro \<font color="#2166ae">adapter\</font> , impostiamo questo \<font color="#2166ae">adapter\</font> , al nostro \<font color="#2166ae">recyclerview\</font> , e stampiamo i valori di ciascun oggetto di questa lista nelle proprie viste e se la lista non ha elementi, impostiamo il nostro \<font color="#2166ae">empty text\</font> , vista come \<font color="#2166ae">visibile\</font> 1 private void inittodolist(list\<parseobject> list) { 2 if (list == null || list isempty()) { 3 empty text setvisibility(view\ visible); 4 return; 5 } 6 empty text setvisibility(view\ gone); 7 8 todoadapter adapter = new todoadapter(list, this); 9 10 recyclerview\ setlayoutmanager(new linearlayoutmanager(this)); 11 recyclerview\ setadapter(adapter); 12 }1 private fun inittodolist(list list\<parseobject>?) { 2 if (list == null || list isempty()) { 3 empty text!! visibility = view\ visible 4 return 5 } 6 empty text? visibility = view\ gone 7 8 val adapter = todoadapter(list as arraylist\<parseobject>, this) 9 10 recyclerview? layoutmanager = linearlayoutmanager(this) 11 recyclerview? adapter = adapter 12 } 4 aggiorna oggetto con il pulsante di modifica nella vista del nostro adattatore, stiamo eseguendo i nostri aggiornamenti con il \<font color="#2166ae">mutablelivedata\</font> , oggetto fornito da android, possiamo ascoltare l'evento di clic del pulsante di modifica sulla nostra homepage quando questo pulsante viene cliccato, apriamo lo stesso pop up e questa volta popoliamo questo pop up con i valori di titolo e descrizione dell'oggetto su cui abbiamo cliccato poi, quando l'utente cambia questa descrizione e titolo e preme salva, prima recuperiamo dal database con l'id di questo oggetto, poi impostiamo le nuove variabili e salviamo di nuovo l'oggetto nota mutablelivedata è una sottoclasse di livedata che viene utilizzata per alcune delle sue proprietà (setvalue/postvalue) e utilizzando queste proprietà possiamo facilmente notificare l'interfaccia utente 1 adapter oneditlistener observe(this, parseobject > { 2 alertdialog builder alertdialogbuilder = new alertdialog builder(mainactivity this); 3 alertdialogbuilder settitle("update a todo"); 4 alertdialogbuilder setcancelable(true); 5 //we are initializing popup views with title and description parameters of parseobject 6 initpopupviewcontrols(parseobject getstring("title"), parseobject getstring("description")); 7 alertdialogbuilder setview(popupinputdialogview); 8 final alertdialog alertdialog = alertdialogbuilder create(); 9 alertdialog show(); 10 savetodobutton setonclicklistener(savetodobuttonview > { 11 if (titleinput gettext() tostring() length() != 0 && descriptioninput gettext() tostring() length() != 0) { 12 alertdialog cancel(); 13 progressdialog show(); 14 parseobject put("title", titleinput gettext() tostring()); 15 parseobject put("description", descriptioninput gettext() tostring()); 16 parseobject saveinbackground(e1 > { 17 progressdialog dismiss(); 18 if (e1 == null) { 19 gettodolist(); 20 } else { 21 showalert("error", e1 getmessage()); 22 } 23 }); 24 } else { 25 showalert("error", "please enter a title and description"); 26 } 27 }); 28 canceluserdatabutton setonclicklistener(cancelbuttonview > alertdialog cancel()); 29 });1 adapter clicklistenertoedit observe(this\@mainactivity, { parseobject > 2 val alertdialogbuilder = alertdialog builder(this\@mainactivity) 3 alertdialogbuilder settitle("update a todo") 4 alertdialogbuilder setcancelable(true) 5 6 //we are initializing popup views with title and description parameters of parseobject 7 8 initpopupviewcontrols( 9 parseobject getstring("title")!!, 10 parseobject getstring("description")!! 11 ) 12 13 alertdialogbuilder setview(popupinputdialogview) 14 val alertdialog = alertdialogbuilder create() 15 alertdialog show() 16 17 savetodobutton? setonclicklistener { savebuttonview > 18 if (titleinput? text tostring() isnotempty() && descriptioninput? text tostring() isnotempty()) { 19 alertdialog cancel() 20 progressdialog? show() 21 parseobject put("title", titleinput? text tostring()) 22 parseobject put("description", descriptioninput? text tostring()) 23 parseobject saveinbackground { e1 > 24 progressdialog? dismiss() 25 if (e1 == null) { 26 gettodolist() 27 } else { 28 showalert("error", e1 message!!) 29 } 30 } 31 } else { 32 showalert("error", "please enter a title and description") 33 } 34 } 35 }) 5 elimina oggetto ascoltiamo l'evento di clic del pulsante di eliminazione nella vista del nostro adattatore con il \<font color="#2166ae">mutablelivedata\</font> oggetto dalla homepage, come nel pulsante di modifica quando il pulsante di eliminazione viene cliccato, forniamo l'id dell'oggetto di parseobject come parametro alla funzione di eliminazione che parse ci ha fornito e eliminiamo questo oggetto dal database 1 adapter ondeletelistener observe(this, parseobject > { 2 progressdialog show(); 3 parseobject deleteinbackground(e > { 4 progressdialog dismiss(); 5 if (e == null) { 6 //we deleted the object and fetching data again 7 gettodolist(); 8 } else { 9 showalert("error",e getmessage()); 10 } 11 }); 12 });1 adapter ondeletelistener observe(this\@mainactivity, { parseobject > 2 progressdialog? show() 3 parseobject deleteinbackground { e > 4 progressdialog? dismiss() 5 if (e == null) { 6 //we deleted the object and fetching data again 7 gettodolist() 8 } else { 9 showalert("error", e message!!) 10 } 11 } 12 }) è fatto! a questo punto, hai imparato come eseguire le operazioni crud di base con parse su android