Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Oku ve Android'de Veri yaz

Bu belge okuma ve Firebase veri yazma temellerini kapsamaktadır.

Firebase veriler yazılır FirebaseDatabase referans ve referans için bir zaman uyumsuz dinleyici takılarak alınan. Dinleyici her zaman tekrar ilk verilerin devlet ve veri değişiklikleri için bir kere tetiklenir.

Bir DatabaseReference alın

Okuma veya yazma verileri veritabanından, sen bir örneğini ihtiyaç için DatabaseReference :

Java

private DatabaseReference mDatabase;
// ...
mDatabase = FirebaseDatabase.getInstance().getReference();

Kotlin + ktx

private lateinit var database: DatabaseReference
// ...
database = Firebase.database.reference

Okuma ve yazma veri

Temel yazma işlemleri

Temel yazma işlemleri için kullanabileceğiniz setValue() o yolda herhangi mevcut verileri değiştirerek, belirli bir referansa verileri kaydetmek. Bu yöntemi yapmak için kullanabilirsiniz:

  • Mevcut JSON türlerine karşılık gelir olarak izler türlerini iletme:
    • String
    • Long
    • Double
    • Boolean
    • Map<String, Object>
    • List<Object>
  • Özel bir Java nesnesini iletin eğer parametre almayan ve özellikleri atanacak kamu alıcılar olan bir varsayılan kurucu sahiptir tanımlayan sınıfı.

Eğer bir Java nesnesini kullanıyorsanız, nesnenin içeriği otomatik iç içe geçmiş bir şekilde çocuk yerleri eşlenir. bir Java nesnesini kullanmak da genellikle kod daha okunaklı ve bakımını kolaylaştırır. Bir temel kullanıcı profiline sahip bir uygulama varsa Örneğin, sizin User olarak görünebilir nesne aşağıdaki gibidir:

Java

@IgnoreExtraProperties
public class User {

    public String username;
    public String email;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }

}

Kotlin + ktx

@IgnoreExtraProperties
data class User(
    var username: String? = "",
    var email: String? = ""
)

Sen sahip bir kullanıcı ekleyebilir setValue() aşağıdaki gibi:

Java

private void writeNewUser(String userId, String name, String email) {
    User user = new User(name, email);

    mDatabase.child("users").child(userId).setValue(user);
}

Kotlin + ktx

private fun writeNewUser(userId: String, name: String, email: String?) {
    val user = User(name, email)
    database.child("users").child(userId).setValue(user)
}

Kullanılması setValue() bu şekilde tüm alt düğümler dahil belirtilen yerde verileri yazar. Ancak, yine de bütün nesneyi yeniden yazmadan bir çocuğu güncelleyebilirsiniz. Kullanıcıların aşağıdaki gibi kullanıcı adı güncelleme olabilir profillerini güncellemeleri izin vermek istiyorsanız:

Java

mDatabase.child("users").child(userId).child("username").setValue(name);

Kotlin + ktx

database.child("users").child(userId).child("username").setValue(name)

değerine sahip etkinlikler için dinle

Kullanmak, bir yolda verileri okumak ve değişiklikleri işler için addValueEventListener() veya addListenerForSingleValueEvent() bir ekleme yöntemi ValueEventListener bir etmek DatabaseReference .

dinleyici Olay geri arama Tipik kullanımı
ValueEventListener onDataChange() Okuma ve yolun tüm içerikleri değişiklikleri işler.

Sen kullanabilirsiniz onDataChange() onlar olayın anda varolan gibi, belirli bir yol üstündeki içindekiler statik anlık okunması yöntemi. Bu yöntem tetiklenir kez dinleyici her seferinde tekrar çocuk, değişiklikleri dahil olmak üzere verileri, ekli ve ne zaman. Olay geri arama çocuk verileri dahil bu konumda tüm verileri içeren bir anlık geçirilir. Hiçbir veri yoksa, anlık dönecektir false Aradığınızda exists() ve null Aradığınızda getValue() Üzerinde.

Aşağıdaki örnek veritabanından bir yazının ayrıntılarını alınırken Sosyal blog uygulaması gösterir:

Java

ValueEventListener postListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // Get Post object and use the values to update the UI
        Post post = dataSnapshot.getValue(Post.class);
        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
    }
};
mPostReference.addValueEventListener(postListener);

Kotlin + ktx

val postListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        // Get Post object and use the values to update the UI
        val post = dataSnapshot.getValue<Post>()
        // ...
    }

    override fun onCancelled(databaseError: DatabaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        // ...
    }
}
postReference.addValueEventListener(postListener)

Dinleyici aldığı DataSnapshot etkinliği sırasında veritabanında belirtilen yerde veri içerir. Arayan getValue() anlık getiri verilerin Java nesne temsilini. Hiçbir veri çağırarak, bir konumda bulunuyorsa getValue() döner null .

Bu örnekte, ValueEventListener de tanımlar onCancelled() okuma iptal edilirse adlandırılan yöntem. Örneğin, bir okuma istemci Firebase veritabanı konumdan okuma izni yoksa iptal edilebilir. Bu yöntem, bir geçirilir DatabaseError arızası meydana neden gösteren bir nesne.

Okuma veriler kez

Bazı durumlarda, bir geri arama kez aradı ve daha sonra hemen böyle sen değişikliğe beklemeyin bir UI öğesi başlatırken gibi çıkarılabilir isteyebilirsiniz. Sen kullanabilirsiniz addListenerForSingleValueEvent() Bu senaryoyu basitleştirmek için bir yöntem: Tekrar tetiklemez sonra bir kez tetikler ve.

Bu sadece bir defa yüklenmesi gerekiyor ve sık değişen veya aktif dinleme gerektiren beklenmemektedir veriler için yararlıdır. Örneğin, önceki örnekte olduğu blogging uygulaması yeni bir yazı yazma başlar bir kullanıcının profilini yüklemek için bu yöntemi kullanır:

veri güncelleme veya silme

Güncelleme uzmanlık alanları

Aynı anda kullanmak, diğer alt düğümlerin üzerine yazmadan bir düğümün belirli çocuklarına yazmak için updateChildren() yöntemini.

Çağrılırken updateChildren() , sen anahtarı için bir yolu belirterek düşük seviyede bir alt değerleri güncelleyebilirsiniz. Veri daha iyi ölçekli birden çok yerde saklanıyorsa, kullandığınız verilerin tüm örneklerini güncelleyebilirsiniz veri fan-out . Örneğin, bir sosyal blogging uygulaması bir olabilir Post böyle sınıfını:

Java

@IgnoreExtraProperties
public class Post {

    public String uid;
    public String author;
    public String title;
    public String body;
    public int starCount = 0;
    public Map<String, Boolean> stars = new HashMap<>();

    public Post() {
        // Default constructor required for calls to DataSnapshot.getValue(Post.class)
    }

    public Post(String uid, String author, String title, String body) {
        this.uid = uid;
        this.author = author;
        this.title = title;
        this.body = body;
    }

    @Exclude
    public Map<String, Object> toMap() {
        HashMap<String, Object> result = new HashMap<>();
        result.put("uid", uid);
        result.put("author", author);
        result.put("title", title);
        result.put("body", body);
        result.put("starCount", starCount);
        result.put("stars", stars);

        return result;
    }

}

Kotlin + ktx

@IgnoreExtraProperties
data class Post(
    var uid: String? = "",
    var author: String? = "",
    var title: String? = "",
    var body: String? = "",
    var starCount: Int = 0,
    var stars: MutableMap<String, Boolean> = HashMap()
) {

    @Exclude
    fun toMap(): Map<String, Any?> {
        return mapOf(
                "uid" to uid,
                "author" to author,
                "title" to title,
                "body" to body,
                "starCount" to starCount,
                "stars" to stars
        )
    }
}

Yayın oluşturmak ve aynı anda son etkinlik yem ve gönderme kullanıcının etkinliği yemi, böyle blog uygulamanın kullandığı koduna güncellemek için:

Java

private void writeNewPost(String userId, String username, String title, String body) {
    // Create new post at /user-posts/$userid/$postid and at
    // /posts/$postid simultaneously
    String key = mDatabase.child("posts").push().getKey();
    Post post = new Post(userId, username, title, body);
    Map<String, Object> postValues = post.toMap();

    Map<String, Object> childUpdates = new HashMap<>();
    childUpdates.put("/posts/" + key, postValues);
    childUpdates.put("/user-posts/" + userId + "/" + key, postValues);

    mDatabase.updateChildren(childUpdates);
}

Kotlin + ktx

private fun writeNewPost(userId: String, username: String, title: String, body: String) {
    // Create new post at /user-posts/$userid/$postid and at
    // /posts/$postid simultaneously
    val key = database.child("posts").push().key
    if (key == null) {
        Log.w(TAG, "Couldn't get push key for posts")
        return
    }

    val post = Post(userId, username, title, body)
    val postValues = post.toMap()

    val childUpdates = hashMapOf<String, Any>(
            "/posts/$key" to postValues,
            "/user-posts/$userId/$key" to postValues
    )

    database.updateChildren(childUpdates)
}

Bu örnek kullanır push() tüm kullanıcılar için mesajları içeren düğümünde bir yayın oluşturma /posts/$postid ve eşzamanlı ile anahtarı almak getKey() . Anahtar o zaman en Kullanıcı mesajlarının ikinci giriş oluşturmak için kullanılabilir /user-posts/$userid/$postid .

Bu yolları kullanarak, tek bir çağrıyla JSON ağacında birden fazla konuma eşzamanlı güncelleştirmeler gerçekleştirebilen updateChildren() böyle bu örnek her iki konumda da yeni yayın oluşturulur nasıl gibi. Bu şekilde yapılan Eşzamanlı güncellemeler atomiktir: ya tüm güncellemeler başarılı veya tüm güncellemeler başarısız.

Bir Tamamlama geri arama ekle

Eğer veri taahhüt edildiğinde bilmek istiyorsanız, bir tamamlama dinleyici ekleyebilirsiniz. Hem setValue() ve updateChildren() yazma başarıyla veritabanına taahhüt edilmiştir çağrılan isteğe bağlı tamamlama dinleyicisi alır. Çağrı başarısız olduysa dinleyici hatası oluştu neden belirten bir hata nesnesi geçirilir.

Java

mDatabase.child("users").child(userId).setValue(user)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Write was successful!
                // ...
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Write failed
                // ...
            }
        });

Kotlin + ktx

database.child("users").child(userId).setValue(user)
        .addOnSuccessListener {
            // Write was successful!
            // ...
        }
        .addOnFailureListener {
            // Write failed
            // ...
        }

Sil veri

Silme verilere en basit yolu aramaktır removeValue() bu verilerin konumun referansı üzerine.

Ayrıca belirterek silebilirsiniz null gibi başka yazma işlemi için değer olarak setValue() veya updateChildren() . Sen ile bu tekniği kullanabilirsiniz updateChildren() tek bir API çağrısında birden fazla çocuk silmek için.

Ayır dinleyici

Callbacks arayarak kaldırılır removeEventListener() sizin Firebase veritabanı Referanstaki yöntemi.

Bir dinleyici, bir veri konuma birden çok kez ilave edilmişse, her olay için birden çok kez denir ve tamamen kaldırmak için çok defalar aynı sayıda ayırmak gerekir.

Arayan removeEventListener() otomatik olarak alt düğümler üzerinde kayıtlı dinleyicileri kaldırmaz bir ebeveyn dinleyici üzerinde; removeEventListener() ayrıca geri arama kaldırmak için herhangi bir çocuk işleyicilerinizde çağrılmalıdır.

işlemler olarak veri kaydet

Böyle sayıcı olarak eşzamanlı değişiklikler, tarafından bozulmuş olabilir verilerle çalışırken, bir kullanabilir işlem operasyonu . Bir güncelleme fonksiyonu ve isteğe bağlı tamamlama geri arama: Bu işlemi iki argümanlar vermek. güncelleme fonksiyonu bağımsız değişken olarak verilerin mevcut durumunu alır ve yazma istediğiniz yeni istenen durumuna döner. Yeni değer başarıyla yazılmadan önce başka bir istemci konuma yazar ederse, güncelleme fonksiyonu yeni akım değeri ile tekrar denir ve yazma denenir.

Örneğin, örnek Sosyal blog uygulamasında, kullanıcıların yıldız ve yıldız ekleme veya kaldırma mesajlar ve aşağıdaki gibi bir post almıştır kaç yıldızlı izlemek için izin verebilir:

Java

private void onStarClicked(DatabaseReference postRef) {
    postRef.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            Post p = mutableData.getValue(Post.class);
            if (p == null) {
                return Transaction.success(mutableData);
            }

            if (p.stars.containsKey(getUid())) {
                // Unstar the post and remove self from stars
                p.starCount = p.starCount - 1;
                p.stars.remove(getUid());
            } else {
                // Star the post and add self to stars
                p.starCount = p.starCount + 1;
                p.stars.put(getUid(), true);
            }

            // Set value and report transaction success
            mutableData.setValue(p);
            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean committed,
                               DataSnapshot currentData) {
            // Transaction completed
            Log.d(TAG, "postTransaction:onComplete:" + databaseError);
        }
    });
}

Kotlin + ktx

private fun onStarClicked(postRef: DatabaseReference) {
    postRef.runTransaction(object : Transaction.Handler {
        override fun doTransaction(mutableData: MutableData): Transaction.Result {
            val p = mutableData.getValue(Post::class.java)
                    ?: return Transaction.success(mutableData)

            if (p.stars.containsKey(uid)) {
                // Unstar the post and remove self from stars
                p.starCount = p.starCount - 1
                p.stars.remove(uid)
            } else {
                // Star the post and add self to stars
                p.starCount = p.starCount + 1
                p.stars[uid] = true
            }

            // Set value and report transaction success
            mutableData.value = p
            return Transaction.success(mutableData)
        }

        override fun onComplete(
            databaseError: DatabaseError?,
            committed: Boolean,
            currentData: DataSnapshot?
        ) {
            // Transaction completed
            Log.d(TAG, "postTransaction:onComplete:" + databaseError!!)
        }
    })
}

birden çok kullanıcı aynı anda aynı yazı yıldızı veya istemci eski veriler olsaydı yanlış olmaktan bir işlem engeller yıldız sayıları kullanma. işlem reddedilirse, sunucu güncellenmiş değeri ile tekrar işlem çalıştırır müşteri, cari değeri döndürür. işlem kabul edilir ya da fazla sayıda girişimde yapılana kadar bu tekrarlar.

Yaz veri çevrimdışı

Bir istemci ağ bağlantısını kaybederse, uygulama düzgün devam edecektir.

Bir Firebase veritabanına bağlı her istemci herhangi bir etkin veri kendi iç versiyonu tutar. veri yazıldığında, ilk olarak bu yerel sürümüne yazmış. Firebase istemcisi sonra uzak veritabanı sunucuları ile ve bir "en iyi performans" olarak diğer müşterilerle bu verileri senkronize eder.

Herhangi bir veri sunucuya yazılmadan önce bir sonucu olarak, tüm yerel etkinlikler derhal veritabanı tetik yazar. Bu uygulama ne olursa olsun ağ gecikmesi veya bağlantı duyarlı kalır demektir.

bağlantı tekrar oluşturulduktan sonra uygulama olayların uygun bir set alması için herhangi bir özel kod yazmak zorunda kalmadan geçerli sunucu durumuyla istemci senkronize olduğu.

Sonraki adımlar