AndroidでのParseデータ型操作ガイド
22 分
androidでのデータ型の解析 はじめに このガイドでは、androidを使用してparseデータ型について学びます。androidアプリからback4appにparseオブジェクトを読み込み、保存します。 parseにデータを保存することは、 \<font color="#2166ae">parseobject\</font> を中心に構築されています。各 \<font color="#2166ae">parseobject\</font> は、json互換のデータのキーと値のペアを含みます。このデータはスキーマレスであり、各 \<font color="#2166ae">parseobject\</font> にどのキーが存在するかを事前に指定する必要はありません。私たちは任意のキーと値のペアを設定でき、バックエンドがそれらを保存します。例えば、ゲームのハイスコアを追跡しているとしましょう。単一の \<font color="#2166ae">parseobject\</font> は次のような内容を含むことができます 1 score 1337 , playername "ショーン・プロット" , cheatmode false キーは英数字の文字列でなければならず、値は次のようにすることができます \<font color="#2166ae">文字列\</font> => \<font color="#2166ae">文字列\</font> \<font color="#2166ae">数値\</font> ( \<font color="#2166ae">int\</font> , \<font color="#2166ae">double\</font> ) \<font color="#2166ae">真偽値\</font> => \<font color="#2166ae">boolean\</font> \<font color="#2166ae">日付時刻\</font> => java util date \<font color="#2166ae">ヌル\</font> => jsonobject null \<font color="#2166ae">配列\</font> =>jsonarray \<font color="#2166ae">ファイル\</font> => parse file \<font color="#2166ae">ポインタ\</font> => 他のparseobject \<font color="#2166ae">リレーション\</font> => parserelation \<font color="#2166ae">ジオポイント\</font> => parsegeopoint 各 \<font color="#2166ae">parseobject\</font> には、異なる種類のデータを区別するために使用できるクラス名があります。たとえば、高得点オブジェクトを \<font color="#2166ae">gamescore\</font> と呼ぶことができます。また、便利のために提供されるいくつかのフィールドを指定する必要はありません \<font color="#2166ae">objectid\</font> は、保存された各オブジェクトの一意の識別子です。 \<font color="#2166ae">createdat\</font> と \<font color="#2166ae">updatedat\</font> は、各オブジェクトがクラウドで作成された時刻と最後に変更された時刻を表します。 これらのフィールドは、新しい \<font color="#2166ae">parseobject\</font> を保存する瞬間にback4appによって自動的に入力されます。 私たちはあなたに \<font color="#2166ae">nameyourclasseslikethis\</font> (uppercamelcase) と \<font color="#2166ae">nameyourkeyslikethis \</font> (lowercamelcase) を推奨します。コードをきれいに保つためです。 このチュートリアルでは、android studio 4 1 1で作成された基本的なアプリを使用します。 \<font color="#2166ae">buildtoolsversion=30 0 2\</font> , \<font color="#2166ae">compile sdk version\</font> = \<font color="#2166ae">30 0 2\</font> と \<font color="#2166ae">targetsdkversion 30\</font> いつでも、私たちのgithubリポジトリを通じて完全なプロジェクトにアクセスできます。 kotlinの例リポジトリ https //github com/templates back4app/android crud operations kotlin javaの例リポジトリ https //github com/templates back4app/android crud operations java 目標 私たちの目標は、parse serverが提供するすべてのデータタイプを処理できるandroidアプリを作成することです。 ここに、私たちが達成しようとしていることのプレビューがあります 前提条件 このチュートリアルを完了するには、次のものが必要です: android studio https //developer android com/studio/index html back4appで作成されたアプリ。 注意 新しいparseアプリのチュートリアル https //www back4app com/docs/get started/new parse app を参照して、back4appでparseアプリを作成する方法を学んでください。 back4appに接続されたandroidアプリ。 注意 parse sdkのインストールチュートリアル https //www back4app com/docs/android/parse android sdk を参照して、back4appに接続されたandroid studioプロジェクトを作成してください。 android 4 1(jelly bean)以上を実行しているデバイス(または 仮想デバイス https //developer android com/studio/run/managing avds html )。 アプリの理解 parseをよりよく理解するためのアプリを作成します \<font color="#2166ae">データ型\</font> 。この \<font color="#2166ae">android\</font> アプリでは、 \<font color="#2166ae">datatypes\</font> というクラスにすべてのデータ型を作成し、このクラスの変数に値を割り当てます。それから、このデータを読み取り、更新します。 注意 データ型 \<font color="#2166ae">ポインタ\</font> 、 \<font color="#2166ae">リレーション\</font> 、 \<font color="#2166ae">ファイル\</font> 、 \<font color="#2166ae">ジオポイント\</font> は、特定のガイドで後ほど説明します。 さあ、始めましょう! 1 アプリテンプレートを作成する 次の変数を \<font color="#2166ae">mainactivity\</font> に定義し、 \<font color="#2166ae">oncreate\</font> メソッドのコードを次のコードに置き換えます。 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 } 次のステップの前に、私たちは \<font color="#2166ae">back4app\</font> を私たちのアプリケーションに接続する必要があります。 \<font color="#2166ae">appid\</font> と \<font color="#2166ae">clientkey\</font> を \<font color="#2166ae">back4app\</font> から \<font color="#2166ae">string xml\</font> ファイルに保存し、その後 \<font color="#2166ae">parse\</font> を私たちの \<font color="#2166ae">app java\</font> または \<font color="#2166ae">app kt\</font> ファイルで初期化します。 もし 新しいparseアプリのチュートリアル https //www back4app com/docs/android/parse android sdk を知らない場合は、こちらを参照してください \<font color="#2166ae">parse\</font> をあなたのアプリに初期化する方法。 2 オブジェクトを保存するためのコード create関数はback4appデータベースに新しいオブジェクトを作成します。私たちは、 \<font color="#2166ae">savedatatypes\</font> 関数を定義し、 \<font color="#2166ae">oncreate\</font> 関数内でこのコードを使用します。この関数を使って、すべてのデータタイプを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 オブジェクトを読むためのコード 私たちは、 \<font color="#2166ae">objectid\</font> 変数を、 \<font color="#2166ae">savedatatypes\</font> 関数に割り当てたものをクエリのパラメータとして渡し、 \<font color="#2166ae">savedatatypes\</font> 関数で保存したデータを読み取ります。 \<font color="#2166ae">readobjects\</font> 関数を使って。 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 } このセクションでは、「 \<font color="#2166ae">データ\</font> 」というモデルクラスを作成しました。私たちは、「 \<font color="#2166ae">readobjects\</font> 」関数で取得したデータを使用して、このモデルクラスからオブジェクトを作成します。これらのオブジェクトを、「 \<font color="#2166ae">データ\</font> 」タイプで作成したリストの要素として渡します。次に、このリストを「 \<font color="#2166ae">showdatatypes\</font> 」関数にパラメータとして渡し、「 \<font color="#2166ae">alertdialog\</font> 」にリストします。 これは \<font color="#2166ae">データ\</font> モデルです。 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 } これは \<font color="#2166ae">showdatatypes\</font> 関数です。 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 オブジェクト更新のためのコード この \<font color="#2166ae">updateobject\</font> 関数は、 \<font color="#2166ae">savedatatypes\</font> 関数で作成されたオブジェクトのデータを更新する責任があります。再び \<font color="#2166ae">objectid\</font> を使用してオブジェクトを更新します。 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 カウンターの使用 上記の例は一般的な使用ケースを含んでいます。 \<font color="#2166ae">intfield\</font> フィールドは、継続的に更新する必要があるカウンターである可能性があります。上記の解決策は機能しますが、面倒であり、同じカウンターを更新しようとする複数のクライアントがいる場合に問題を引き起こす可能性があります。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つあります \<font color="#2166ae">setadd\</font> と \<font color="#2166ae">setaddall\</font> 指定されたオブジェクトを配列フィールドの末尾に追加します。 \<font color="#2166ae">setaddunique\</font> と \<font color="#2166ae">setaddallunique\</font> 配列フィールドにすでに含まれていない指定されたオブジェクトのみをそのフィールドに追加します。挿入の位置は保証されません。 \<font color="#2166ae">remove\</font> と \<font color="#2166ae">removeall\</font> 指定されたオブジェクトのすべてのインスタンスを配列フィールドから削除します。 6 1 addとaddallの例 \<font color="#2166ae">liststringfield\</font> の値は \["a","b","c","d","e","f","g","g"] 以下のコードを実行します 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フィールドの結果は \["a","b","c","d","e","e","f","g","g"] 6 2 adduniqueとaddalluniqueの例 \<font color="#2166ae">liststringfield\</font> の値は \["a","b","c","d","e"] 以下のコードを実行します 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() このコマンドの後、 \<font color="#2166ae">stringlist\</font> フィールドの結果は次のようになります \["a","b","c","d","e","f"] 値は重複しませんでした。 6 3 removeallを使用した例 \<font color="#2166ae">liststringfield\</font> の値は \["a","b","c","d","e","f"] 以下のコードを実行します 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() このコマンドの後、 \<font color="#2166ae">stringlist\</font> フィールドの結果は次のようになります \["a","b"] 注意 現在、同じ保存操作で配列からアイテムを原子的に追加および削除することはできません。異なる配列操作ごとに保存を個別に呼び出す必要があります。 7 parseobjectから単一フィールドを削除する オブジェクトから単一フィールドを削除するには、 \<font color="#2166ae">remove\</font> 操作を使用します 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() 完了! この時点で、私たちは \<font color="#2166ae">parseデータタイプ\</font> を \<font color="#2166ae">android\</font> で学びました。