Android
Data objects
안드로이드에서 Parse 데이터 유형 사용 및 관리 가이드
23 분
안드로이드에서 데이터 유형 파싱 소개 이 가이드에서는 안드로이드를 사용하여 parse 데이터 유형에 대해 배웁니다 안드로이드 앱에서 back4app의 parse 객체를 읽고 저장할 것입니다 parse에 데이터를 저장하는 것은 parseobject parseobject 각 parseobject parseobject 는 json 호환 데이터의 키 값 쌍을 포함합니다 이 데이터는 스키마가 없으므로 각 parseobject parseobject 에 어떤 키가 존재하는지 미리 지정할 필요가 없습니다 우리는 원하는 키 값 쌍을 설정할 수 있으며, 우리의 백엔드는 이를 저장합니다 예를 들어, 게임의 최고 점수를 추적한다고 가정해 보겠습니다 단일 parseobject parseobject 는 다음과 같은 내용을 포함할 수 있습니다 키는 영숫자 문자열이어야 하며, 값은 다음과 같을 수 있습니다 문자열 문자열 => 문자열 문자열 숫자 숫자 (다음과 같은 원시 숫자 값 int int , double double ) 불리언 불리언 => boolean boolean 날짜 및 시간 날짜 및 시간 => java util date 널 널 => jsonobject null 배열 배열 =>jsonarray 파일 파일 => parse file 포인터 포인터 => 다른 parseobject 관계 관계 => parserelation 지오포인트 지오포인트 => parsegeopoint 각 parseobject parseobject 는 우리가 다양한 종류의 데이터를 구별하는 데 사용할 수 있는 클래스 이름을 가지고 있습니다 예를 들어, 우리는 최고 점수 객체를 gamescore gamescore 라고 부를 수 있습니다 또한 편의를 위해 제공되는 몇 가지 필드를 지정할 필요가 없습니다 objectid objectid 는 저장된 각 객체에 대한 고유 식별자입니다 createdat createdat 와 updatedat updatedat 은 각 객체가 클라우드에서 생성되고 마지막으로 수정된 시간을 나타냅니다 이 필드는 새 parseobject parseobject 를 저장할 때 back4app에 의해 자동으로 채워집니다 우리는 당신에게 nameyourclasseslikethis nameyourclasseslikethis (uppercamelcase) 및 nameyourkeyslikethis nameyourkeyslikethis (lowercamelcase)를 사용할 것을 권장합니다 코드를 깔끔하게 유지하기 위해서입니다 이 튜토리얼은 android studio 4 1 1에서 생성된 기본 앱을 사용합니다 buildtoolsversion=30 0 2 buildtoolsversion=30 0 2 , compile sdk version compile sdk version = 30 0 2 30 0 2 및 targetsdkversion 30 targetsdkversion 30 언제든지 github 리포지토리를 통해 전체 프로젝트에 접근할 수 있습니다 kotlin 예제 리포지토리 java 예제 리포지토리 목표 우리의 목표는 parse server에서 제공하는 모든 데이터 유형을 처리할 수 있는 android 앱을 만드는 것입니다 여기 우리가 달성할 것에 대한 미리보기입니다 전제 조건 이 튜토리얼을 완료하려면 다음이 필요합니다 안드로이드 스튜디오 back4app에서 생성된 앱 참고 새 파스 앱 튜토리얼 을 따라 back4app에서 파스 앱을 만드는 방법을 배우세요 back4app에 연결된 안드로이드 앱 참고 파스 sdk 설치 튜토리얼 을 따라 back4app에 연결된 안드로이드 스튜디오 프로젝트를 만드세요 안드로이드 4 1 (젤리빈) 이상에서 실행되는 장치 (또는 가상 장치 ) 우리 앱 이해하기 parse에 대한 더 나은 이해를 위한 앱을 만들 것입니다 데이터 유형 데이터 유형 이 안드로이드 안드로이드 앱에서는 datatypes datatypes 라는 클래스에서 모든 데이터 유형을 생성하고 이 클래스의 변수에 값을 할당합니다 그런 다음 이 데이터를 읽고 업데이트할 것입니다 참고 데이터 유형 포인터 포인터 , 관계 관계 , 파일 파일 , 지오포인트 지오포인트 은 나중에 특정 가이드에서 다룰 것입니다 시작해봅시다! 1 앱 템플릿 만들기 다음 변수를 mainactivity mainactivity 에 정의하고 oncreate oncreate 메서드의 코드를 다음 코드로 교체합니다 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 } 다음 단계에 앞서, back4app back4app 을(를) 우리 애플리케이션에 연결해야 합니다 appid appid 와 clientkey clientkey 를 back4app back4app 에서 string xml string xml 파일에 저장한 후, parse parse 를 우리 app java app java 또는 app kt app kt 파일에서 초기화해야 합니다 새 parse 앱 튜토리얼 을(를) 따라가세요 parse parse 를(을) 앱에 초기화하는 방법을 모른다면 2 객체 저장을 위한 코드 create 함수는 back4app 데이터베이스에 새로운 객체를 생성합니다 우리는 savedatatypes savedatatypes 함수를 정의하고 oncreate oncreate 함수에서 호출합니다 이 함수에서 다음 코드를 사용합니다 우리는 이 함수를 사용하여 모든 데이터 유형을 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 객체 읽기 코드 우리는 objectid objectid 변수를 savedatatypes savedatatypes 함수에서 쿼리에 매개변수로 전달하고, savedatatypes savedatatypes 함수에서 저장한 데이터를 readobjects readobjects 함수로 읽어올 것입니다 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 } 이 섹션에서는 데이터 데이터 라는 모델 클래스를 만들었습니다 우리는 readobjects readobjects 함수에서 얻은 데이터를 사용하여 이 모델 클래스의 객체를 생성합니다 우리는 이 객체들을 데이터 데이터 유형으로 만든 목록의 요소로 제공합니다 그런 다음 이 목록을 showdatatypes showdatatypes 함수의 매개변수로 제공하고 alertdialog alertdialog 에 나열합니다 이것은 데이터 데이터 모델입니다 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 } 이것은 showdatatypes showdatatypes 함수입니다 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 객체 업데이트를 위한 코드 이 updateobject updateobject 함수는 savedatatypes savedatatypes 함수에서 생성된 객체의 데이터를 업데이트하는 역할을 합니다 우리는 다시 objectid objectid 를 사용하여 객체를 업데이트합니다 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 카운터 사용하기 위의 예제는 일반적인 사용 사례를 포함하고 있습니다 intfield intfield 필드는 우리가 지속적으로 업데이트해야 하는 카운터가 될 수 있습니다 위의 솔루션은 작동하지만 번거롭고 여러 클라이언트가 동일한 카운터를 업데이트하려고 할 경우 문제를 일으킬 수 있습니다 parse는 카운터 유형 데이터를 저장하는 데 도움이 되는 모든 숫자 필드를 원자적으로 증가시키는 메서드를 제공합니다 따라서 동일한 업데이트를 다음과 같이 다시 작성할 수 있습니다 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 리스트 사용하기 parse는 리스트 데이터를 저장하는 데 도움이 되는 메서드도 제공합니다 리스트 필드를 원자적으로 변경하는 데 사용할 수 있는 세 가지 작업이 있습니다 setadd setadd 및 setaddall setaddall 주어진 객체를 배열 필드의 끝에 추가합니다 setaddunique setaddunique 및 setaddallunique setaddallunique 배열 필드에 이미 포함되지 않은 주어진 객체만 해당 필드에 추가합니다 삽입 위치는 보장되지 않습니다 remove remove 및 removeall removeall 주어진 객체의 모든 인스턴스를 배열 필드에서 제거합니다 6 1 add 및 addall 예제 liststringfield liststringfield 의 값은 아래 코드를 실행합니다 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() 이 명령어 후에 stringlist 필드의 결과는 6 2 addunique 및 addallunique 예제 liststringfield liststringfield 의 값은 아래 코드를 실행합니다 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() 이 명령어 후에 stringlist stringlist 필드의 결과는 다음과 같습니다 값이 중복되지 않았습니다 6 3 removeall을 사용한 예제 liststringfield liststringfield 의 값은 다음과 같습니다 아래 코드를 실행합니다 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() 이 명령어 후에 stringlist stringlist 필드의 결과는 다음과 같습니다 참고 현재 동일한 저장에서 배열의 항목을 원자적으로 추가하고 제거하는 것은 불가능합니다 수행하려는 각 배열 작업에 대해 별도로 저장을 호출해야 합니다 7 parseobject에서 단일 필드 제거하기 다음의 remove remove 작업을 사용하여 객체에서 단일 필드를 삭제할 수 있습니다 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() 완료되었습니다! 이 시점에서 우리는 parse 데이터 유형 parse 데이터 유형 에 대해 배웠습니다 안드로이드 안드로이드