Android
Data objects
AndroidでのParseデータ型操作ガイド
22 分
androidでのデータ型の解析 はじめに このガイドでは、androidを使用してparseデータ型について学びます。androidアプリから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アプリを作成することです。 ここに、私たちが達成しようとしていることのプレビューがあります 前提条件 このチュートリアルを完了するには、次のものが必要です: android studio back4appで作成されたアプリ。 注意 新しいparseアプリのチュートリアル を参照して、back4appでparseアプリを作成する方法を学んでください。 back4appに接続されたandroidアプリ。 注意 parse sdkのインストールチュートリアル を参照して、back4appに接続されたandroid studioプロジェクトを作成してください。 android 4 1(jelly bean)以上を実行しているデバイス(または 仮想デバイス )。 アプリの理解 parseをよりよく理解するためのアプリを作成します データ型 データ型 。この android android アプリでは、 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は、リストデータの保存を助けるためのメソッドも提供しています。リストフィールドを原子的に変更するために使用できる操作は3つあります 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データタイプ を android android で学びました。