環境とプロジェクトの作成方法は、『Firebase API + Android Studio : Database 処理の基本設定』にまとめています。そちらを参照して下さい。 データの読み出し方法については、『Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります』をご覧ください。 DatabaseReference で更新場所の参照を作成 child メソッドでパス文字列を渡すか、child メソッドの戻り値も DatabaseReference なので、さらに child メソッドでツリーをチェーンして参照を作成します。データベースへの更新は、基本的にこの DatabaseReference で参照した場所に対して setValue を実行する事によって、サーバへ反映されます。 setValue の引数の形式 単純な setValue は、Object を引数として一般的なオブジェクトに加えて、以下のデータ型を使用する事ができます。Boolean Long Double Map<String, Object> List<Object>また、setValue に対してのサーバーのステータスは、意図的にイベントを追加する必要がありますが、多くの場合そこまでの処理を行う必要は無いと思います。ただ、パーミッションによって、アクセスできない事を想定した処理が必要な場合は以下のようにします。 databaseError が null の場合、正常に更新されているはすです。一つ目の参照は、fri に対する更新の DatabaseReference が返って来るので、更新した内容のみ表示しています。二つ目の参照は、getParent によって、データ全体の内容を表示しています。 これに対して、書き込み結果を考慮しない場合は以下のように単純になります。 setValue の戻り値(Task)よりイベントを作成する 成功か失敗かを知りたいだけならば、こつらのほうがすっきりした印象があります。もちろん、task より、Exception を知る事ができるので、再度の参照を行わないのであればイベント内だけで全てが完結します。 データの削除 データの削除は、setValue に null をセットする事によって 簡潔に実行できます。但し、誤ってツリーの途中を削除してしまうと、その下位にあるデータは全て削除されるので注意が必要です クラスによる保存 データの構造を クラスで定義して、そのクラスを使用して保存する事ができます。データは、public なフィールドまたは、setter / getter で定義します。さらに、@Exclude アノテーションによって、メソッドの実行対象からフィールドを除外する事ができます。
public class MyUser { public String code; public String name; public String furi; public long kyuyo; private long teate = 10000; public MyUser() {} public MyUser(String code, String name, String furi, long kyuyo) { this.code = code; this.name = name; this.furi = furi; this.kyuyo = kyuyo; this.teate = 0; } long getTeate(){ return this.teate; } @Exclude void setTeate(long teate){ this.teate = teate; } }
push メソッドによる、ユニークキーの作成 ツリーにデータ構造をクラスで保存する際、ユニークなキーをサーバ側で追加して、その下にデータを保存できます。 ▼ 結果サンプル ArrayList とクラスを使用した一括更新 他のWEBから取得して JSON フォーマットのデータを、Google Gson を使用してデシリアライズ(fromJson)して更新に使用できると思います。 updateChildren メソッドよる、HashMap での更新 固定フォーマットではない場合、HashMap を使用する事によって、自由度の高いデータを作成する事もできます ソースコード
public class MainActivity extends AppCompatActivity { private DatabaseReference mDatabase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDatabase = FirebaseDatabase.getInstance().getReference(); Button saveButton1 = (Button) MainActivity.this.findViewById(R.id.saveButton1); saveButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("lightbox","単純データ保存"); // 書き込み結果を考慮しない mDatabase.child("users/3/code").setValue("0004"); mDatabase.child("users/3/kyuyo").setValue(10000); // setValue の戻り値(Task<Void>) の addOnCompleteListener で処理を行う // ( 通常、パーミッションによる書き込みの失敗を対処 ) mDatabase .child("users") .child("3") .child("name") .setValue("高田 冬美") .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Log.i("lightbox", "書き込みに成功しました"); Log.i("lightbox", task.toString()); } else { Log.i("lightbox", task.getException().toString()); task.getException().printStackTrace(); } } }); // setValue の第二引数にイベントを登録する // ( 通常、パーミッションによる書き込みの失敗を対処 ) mDatabase .child("users") .child("3") .child("fri") .setValue("タカタ フユミ", new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { if (databaseError == null) { Log.i("lightbox", "書き込みに成功しました"); Log.i("lightbox", databaseReference.toString()); databaseReference .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Log.i("lightbox",dataSnapshot.getValue().toString()); } @Override public void onCancelled(DatabaseError databaseError) { } }); databaseReference.getParent() .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Log.i("lightbox",dataSnapshot.getValue().toString()); MyUser user = dataSnapshot.getValue(MyUser.class); Log.i("lightbox",String.format("%s",user.code)); Log.i("lightbox",String.format("%d",user.getTeate())); } @Override public void onCancelled(DatabaseError databaseError) { } }); } else { Log.i("lightbox", databaseError.toString()); databaseError.toException().printStackTrace(); } } }); } }); Button deleteButton1 = (Button) MainActivity.this.findViewById(R.id.deleteButton1); deleteButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("lightbox","インデックスでエントリを削除"); mDatabase.child("users").child("3").setValue(null); mDatabase.child("post").setValue(null); mDatabase.child("users").child("4/furi").setValue(null); } }); Button saveButton2 = (Button) MainActivity.this.findViewById(R.id.saveButton2); saveButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("lightbox","MyUserクラスによるデータ保存"); MyUser user = new MyUser("0005","内高 友之","ウチタカ トモユキ",150000); mDatabase.child("users/4").setValue(user); } }); Button saveButton3 = (Button) MainActivity.this.findViewById(R.id.saveButton3); saveButton3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("lightbox","push and MyUser"); DatabaseReference treeKey = mDatabase.child("post").push(); MyUser user = new MyUser("0005","内高 友之","ウチタカ トモユキ",150000); treeKey.setValue(user); } }); Button saveButton4 = (Button) MainActivity.this.findViewById(R.id.saveButton4); saveButton4.setAllCaps(false); saveButton4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("lightbox","Hash Map"); HashMap<String, Object> entry = new HashMap<String, Object> (); entry.put("code", "A001"); entry.put("name", "山田 太郎"); entry.put("kyuyo", 100000); DatabaseReference treeKey = mDatabase.child("post/entry").push(); treeKey.updateChildren(entry); } }); Button saveButton5 = (Button) MainActivity.this.findViewById(R.id.saveButton5); saveButton5.setAllCaps(false); saveButton5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("lightbox","Array List"); ArrayList<MyUser> userList = new ArrayList<MyUser>(); DatabaseReference listTree = mDatabase.child("post/list"); userList.add(new MyUser("0001","内高 001","ウチタカ 001",10000)); userList.add(new MyUser("0002","内高 002","ウチタカ 002",20000)); userList.add(new MyUser("0003","内高 003","ウチタカ 003",30000)); listTree.setValue(userList); } }); } }
関連する記事 Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります。 Firebase API + Android Studio : Database 処理の基本設定 Android Studio 2.2 で新規プロジェクトを作成すると『Could not reserve enough space for 1572864KB object heap』というエラーが出る場合の対処方法
|
【2016 Android Studioの最新記事】
- Android Studio で Twitter4J で ListView に検索結果を表示する
- Android Studio で Twitter4J で画像付きツイート
- 内部ストレージを起点とした画像データの処理 / Android
- カメラを起点とした画像データの処理 / Android
- バグ : Android Studio 2.2.2 で、spinnerMode を dialog に設定すると app:spinnerMode となってしまいます
- ListView + カスタム ArrayAdapter + ViewSwitcher + Firebase API + Data Binding : 更新処理 / Android Studio
- Firebase storage に画像をアップロードする。1) ギャラリーから、2) 実行中の画面 / Android
- Android : 画像関連のテスト用カメラアプリ
- Firebase storage の画像を ファイルとしてダウンロードして ギャラリーに保存する( ImageView にも表示する ) / Android
- Firebase storage の画像の URL を取得して、通常と同様に Stream でダウンロードして ImageView に表示する / Android
- Firebase storage の画像をメモリに直接ダウンロードして ImageView に表示する / Android
- Android : Firebase の データを REST API の PUT コマンドで更新する
- Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります。(orderByChild 使う場合は、getChildren ..
- Android : Data Binding + Firebase API で ListView にデータを表示する
- Firebase API + Android Studio : Database 処理の基本設定
- Android Studio 2.2 で新規プロジェクトを作成すると『Could not reserve enough space for 1572864KB object heap』というエラーが出..