SQLの窓

2016年09月20日


Firebase API + Android Studio : Database にデータを保存は単純で、DatabaseReference の setValue メソッドを使用します

環境とプロジェクトの作成方法は、『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の最新記事】
posted by lightbox at 2016-09-20 17:12 | 2016 Android Studio | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり