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

Verileri Kaydetme

Bu belge, Firebase Gerçek Zamanlı Veritabanınıza veri yazmak için dört yöntemi kapsar: ayarlama, güncelleme, push ve işlem desteği.

Verileri Kaydetme Yolları

Ayarlamak messages/users/<username> gibi tanımlanmış bir yola veri yazma veya değiştirme
Güncelleme Tüm verileri değiştirmeden tanımlanmış bir yol için bazı anahtarları güncelleyin
it Veritabanındaki veri listesine ekleyin . Listeye her yeni düğüm eklediğinizde, veritabanınız messages/users/<unique-user-id>/<username> gibi benzersiz bir anahtar oluşturur
işlem Eşzamanlı güncellemelerle bozulmuş olabilecek karmaşık verilerle çalışırken işlemleri kullanın

Verileri Kaydetme

Temel veritabanı yazma işlemi, yeni verileri belirtilen veritabanı başvurusuna kaydeden ve bu yoldaki varolan verileri değiştiren bir kümedir. Seti anlamak için basit bir blog uygulaması oluşturacağız. Uygulamanızın verileri şu veritabanı başvurusunda saklanır:

Java
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("server/saving-data/fireblog");
node.js
// Import Admin SDK
var admin = require("firebase-admin");

// Get a database reference to our blog
var db = admin.database();
var ref = db.ref("server/saving-data/fireblog");
piton
# Import database module.
from firebase_admin import db

# Get a database reference to our blog.
ref = db.reference('server/saving-data/fireblog')
Git
// Create a database client from App.
client, err := app.Database(ctx)
if err != nil {
	log.Fatalln("Error initializing database client:", err)
}

// Get a database reference to our blog.
ref := client.NewRef("server/saving-data/fireblog")

Bazı kullanıcı verilerini kaydederek başlayalım. Her kullanıcıyı benzersiz bir kullanıcı adıyla depolayacağız ve tam adını ve doğum tarihini de saklayacağız. Her kullanıcının benzersiz bir kullanıcı adı olacağından, zaten anahtarınız olduğundan ve bir tane oluşturmanız gerekmediğinden push yöntemi yerine set yöntemini kullanmak mantıklıdır.

İlk olarak, kullanıcı verilerinize bir veritabanı referansı oluşturun. Daha sonra bir kullanıcı nesnesini kullanıcının kullanıcı adı, tam adı ve doğum günü ile veritabanına kaydetmek için set() / setValue() kullanın. Dizi, sayı, boole, null , dizi veya herhangi bir JSON nesnesini geçirebilirsiniz. null iletilirse, belirtilen konumdaki veriler kaldırılır. Bu durumda ona bir nesne ileteceksiniz:

Java
public static class User {

  public String date_of_birth;
  public String full_name;
  public String nickname;

  public User(String dateOfBirth, String fullName) {
    // ...
  }

  public User(String dateOfBirth, String fullName, String nickname) {
    // ...
  }

}

DatabaseReference usersRef = ref.child("users");

Map<String, User> users = new HashMap<>();
users.put("alanisawesome", new User("June 23, 1912", "Alan Turing"));
users.put("gracehop", new User("December 9, 1906", "Grace Hopper"));

usersRef.setValueAsync(users);
node.js
var usersRef = ref.child("users");
usersRef.set({
  alanisawesome: {
    date_of_birth: "June 23, 1912",
    full_name: "Alan Turing"
  },
  gracehop: {
    date_of_birth: "December 9, 1906",
    full_name: "Grace Hopper"
  }
});
piton
users_ref = ref.child('users')
users_ref.set({
    'alanisawesome': {
        'date_of_birth': 'June 23, 1912',
        'full_name': 'Alan Turing'
    },
    'gracehop': {
        'date_of_birth': 'December 9, 1906',
        'full_name': 'Grace Hopper'
    }
})
Git

// User is a json-serializable type.
type User struct {
	DateOfBirth string `json:"date_of_birth,omitempty"`
	FullName    string `json:"full_name,omitempty"`
	Nickname    string `json:"nickname,omitempty"`
}

usersRef := ref.Child("users")
err := usersRef.Set(ctx, map[string]*User{
	"alanisawesome": {
		DateOfBirth: "June 23, 1912",
		FullName:    "Alan Turing",
	},
	"gracehop": {
		DateOfBirth: "December 9, 1906",
		FullName:    "Grace Hopper",
	},
})
if err != nil {
	log.Fatalln("Error setting value:", err)
}

Bir JSON nesnesi veritabanına kaydedildiğinde, nesne özellikleri otomatik olarak iç veritabanı biçiminde veritabanı alt konumlarıyla eşlenir. Şimdi https://docs-examples.firebaseio.com/server/saving-data/fireblog/users/alanisawesome/full_name URL'sine giderseniz, "Alan Turing" değerini göreceğiz. Verileri doğrudan bir alt konuma da kaydedebilirsiniz:

Java
usersRef.child("alanisawesome").setValueAsync(new User("June 23, 1912", "Alan Turing"));
usersRef.child("gracehop").setValueAsync(new User("December 9, 1906", "Grace Hopper"));
node.js
usersRef.child("alanisawesome").set({
  date_of_birth: "June 23, 1912",
  full_name: "Alan Turing"
});
usersRef.child("gracehop").set({
  date_of_birth: "December 9, 1906",
  full_name: "Grace Hopper"
});
piton
users_ref.child('alanisawesome').set({
    'date_of_birth': 'June 23, 1912',
    'full_name': 'Alan Turing'
})
users_ref.child('gracehop').set({
    'date_of_birth': 'December 9, 1906',
    'full_name': 'Grace Hopper'
})
Git
if err := usersRef.Child("alanisawesome").Set(ctx, &User{
	DateOfBirth: "June 23, 1912",
	FullName:    "Alan Turing",
}); err != nil {
	log.Fatalln("Error setting value:", err)
}

if err := usersRef.Child("gracehop").Set(ctx, &User{
	DateOfBirth: "December 9, 1906",
	FullName:    "Grace Hopper",
}); err != nil {
	log.Fatalln("Error setting value:", err)
}

Yukarıdaki iki örnek - her iki değeri bir nesne ile aynı anda yazmak ve bunları alt konumlara ayrı ayrı yazmak - veritabanınıza aynı verilerin kaydedilmesine neden olur:

{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing"
    },
    "gracehop": {
      "date_of_birth": "December 9, 1906",
      "full_name": "Grace Hopper"
    }
  }
}

İlk örnek, verileri izleyen istemcilerde yalnızca bir olayı tetiklerken, ikinci örnek iki olayı tetikleyecektir. Verinin zaten usersRef mevcut olması usersRef , ilk yaklaşımın üzerine yazılacağını, ancak ikinci yöntemin sadece ayrı ayrı her bir düğümün değerini değiştirirken, diğer usersRef çocuklarını da değiştireceğini unutmayın.

Kayıtlı Verileri Güncelleme

Diğer alt düğümlerin üzerine yazmadan aynı anda bir veritabanı konumunun birden çok alt öğesine yazmak istiyorsanız, güncelleme yöntemini aşağıda gösterildiği gibi kullanabilirsiniz:

Java
DatabaseReference hopperRef = usersRef.child("gracehop");
Map<String, Object> hopperUpdates = new HashMap<>();
hopperUpdates.put("nickname", "Amazing Grace");

hopperRef.updateChildrenAsync(hopperUpdates);
node.js
var hopperRef = usersRef.child("gracehop");
hopperRef.update({
  "nickname": "Amazing Grace"
});
piton
hopper_ref = users_ref.child('gracehop')
hopper_ref.update({
    'nickname': 'Amazing Grace'
})
Git
hopperRef := usersRef.Child("gracehop")
if err := hopperRef.Update(ctx, map[string]interface{}{
	"nickname": "Amazing Grace",
}); err != nil {
	log.Fatalln("Error updating child:", err)
}

Bu Grace'in verilerini takma adını içerecek şekilde güncelleyecektir. Yerine güncelleme burada setini kullanmış olsaydık, her iki silinmiş olurdu full_name ve date_of_birth senin dan hopperRef .

Firebase Gerçek Zamanlı Veritabanı aynı zamanda çok yollu güncellemeleri de destekler. Bu, güncellemenin artık veritabanınızdaki birden çok konumdaki değerleri aynı anda güncelleyebileceği anlamına gelir; bu , verilerinizi normalleştirmenize yardımcı olan güçlü bir özelliktir. Çok yollu güncellemeleri kullanarak, hem Grace hem de Alan'a aynı anda takma adlar ekleyebilirsiniz:

Java
Map<String, Object> userUpdates = new HashMap<>();
userUpdates.put("alanisawesome/nickname", "Alan The Machine");
userUpdates.put("gracehop/nickname", "Amazing Grace");

usersRef.updateChildrenAsync(userUpdates);
node.js
usersRef.update({
  "alanisawesome/nickname": "Alan The Machine",
  "gracehop/nickname": "Amazing Grace"
});
piton
users_ref.update({
    'alanisawesome/nickname': 'Alan The Machine',
    'gracehop/nickname': 'Amazing Grace'
})
Git
if err := usersRef.Update(ctx, map[string]interface{}{
	"alanisawesome/nickname": "Alan The Machine",
	"gracehop/nickname":      "Amazing Grace",
}); err != nil {
	log.Fatalln("Error updating children:", err)
}

Bu güncellemeden sonra, Alan ve Grace'in takma adları eklendi:

{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing",
      "nickname": "Alan The Machine"
    },
    "gracehop": {
      "date_of_birth": "December 9, 1906",
      "full_name": "Grace Hopper",
      "nickname": "Amazing Grace"
    }
  }
}

Nesneleri, yolları içeren nesneler yazarak güncellemeye çalışmanın farklı davranışlarla sonuçlanacağını unutmayın. Grace ve Alan'ı bu şekilde güncellemeye çalışırsanız ne olduğuna bir göz atalım:

Java
Map<String, Object> userNicknameUpdates = new HashMap<>();
userNicknameUpdates.put("alanisawesome", new User(null, null, "Alan The Machine"));
userNicknameUpdates.put("gracehop", new User(null, null, "Amazing Grace"));

usersRef.updateChildrenAsync(userNicknameUpdates);
node.js
usersRef.update({
  "alanisawesome": {
    "nickname": "Alan The Machine"
  },
  "gracehop": {
    "nickname": "Amazing Grace"
  }
});
piton
users_ref.update({
    'alanisawesome': {
        'nickname': 'Alan The Machine'
    },
    'gracehop': {
        'nickname': 'Amazing Grace'
    }
})
Git
if err := usersRef.Update(ctx, map[string]interface{}{
	"alanisawesome": &User{Nickname: "Alan The Machine"},
	"gracehop":      &User{Nickname: "Amazing Grace"},
}); err != nil {
	log.Fatalln("Error updating children:", err)
}

Bu, tüm davranışların /users düğümünün üzerine yazılması gibi farklı davranışlarla sonuçlanır:

{
  "users": {
    "alanisawesome": {
      "nickname": "Alan The Machine"
    },
    "gracehop": {
      "nickname": "Amazing Grace"
    }
  }
}

Tamamlama Geri Araması Ekleme

Node.js ve Java Yönetici SDK'larında verilerinizin ne zaman işlendiğini bilmek istiyorsanız, tamamlama geri araması ekleyebilirsiniz. Bu SDK'lardaki hem ayar hem de güncelleştirme yöntemleri, yazma veritabanına işlendiğinde çağrılan isteğe bağlı bir tamamlama geri araması alır. Arama herhangi bir nedenle başarısız olursa, geri aramanın hatanın neden oluştuğunu belirten bir hata nesnesi iletilir. Python ve Go Admin SDK'larında tüm yazma yöntemleri engellenir. Diğer bir deyişle, yazma yöntemleri veritabanına bağlanana kadar yazma yöntemleri dönmez.

Java
DatabaseReference dataRef = ref.child("data");
dataRef.setValue("I'm writing data", new DatabaseReference.CompletionListener() {
  @Override
  public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
    if (databaseError != null) {
      System.out.println("Data could not be saved " + databaseError.getMessage());
    } else {
      System.out.println("Data saved successfully.");
    }
  }
});
node.js
dataRef.set("I'm writing data", function(error) {
  if (error) {
    alert("Data could not be saved." + error);
  } else {
    alert("Data saved successfully.");
  }
});

Veri Listelerini Kaydetme

Veri listeleri oluştururken, çoğu uygulamanın çok kullanıcılı niteliğini akılda tutmak ve liste yapınızı buna göre ayarlamak önemlidir. Yukarıdaki örneğe genişleyerek uygulamanıza blog gönderileri ekleyelim. İlk içgüdünüz, aşağıdaki gibi otomatik artan tamsayı dizinleri olan çocukları depolamak için set kullanmak olabilir:

// NOT RECOMMENDED - use push() instead!
{
  "posts": {
    "0": {
      "author": "gracehop",
      "title": "Announcing COBOL, a New Programming Language"
    },
    "1": {
      "author": "alanisawesome",
      "title": "The Turing Machine"
    }
  }
}

Bir kullanıcı yeni bir yazı eklerse, /posts/2 olarak saklanır. Bu, yalnızca tek bir yazar yayın ekleseydi işe yarar, ancak ortak çalışma blog uygulamanızda birçok kullanıcı aynı anda yayın ekleyebilir. İki yazar aynı anda /posts/2 yazarsa, gönderilerden biri diğeri tarafından silinir.

Bunu çözmek için, Firebase istemcileri her yeni alt öğe için benzersiz bir anahtar üreten bir push() işlevi sağlar . Benzersiz çocuk anahtarları kullanarak, birçok istemci yazma çakışmalarından endişe etmeden aynı anda çocukları aynı konuma ekleyebilir.

Java
public static class Post {

  public String author;
  public String title;

  public Post(String author, String title) {
    // ...
  }

}

DatabaseReference postsRef = ref.child("posts");

DatabaseReference newPostRef = postsRef.push();
newPostRef.setValueAsync(new Post("gracehop", "Announcing COBOL, a New Programming Language"));

// We can also chain the two calls together
postsRef.push().setValueAsync(new Post("alanisawesome", "The Turing Machine"));
node.js
var postsRef = ref.child("posts");

var newPostRef = postsRef.push();
newPostRef.set({
  author: "gracehop",
  title: "Announcing COBOL, a New Programming Language"
});

// we can also chain the two calls together
postsRef.push().set({
  author: "alanisawesome",
  title: "The Turing Machine"
});
piton
posts_ref = ref.child('posts')

new_post_ref = posts_ref.push()
new_post_ref.set({
    'author': 'gracehop',
    'title': 'Announcing COBOL, a New Programming Language'
})

# We can also chain the two calls together
posts_ref.push().set({
    'author': 'alanisawesome',
    'title': 'The Turing Machine'
})
Git

// Post is a json-serializable type.
type Post struct {
	Author string `json:"author,omitempty"`
	Title  string `json:"title,omitempty"`
}

postsRef := ref.Child("posts")

newPostRef, err := postsRef.Push(ctx, nil)
if err != nil {
	log.Fatalln("Error pushing child node:", err)
}

if err := newPostRef.Set(ctx, &Post{
	Author: "gracehop",
	Title:  "Announcing COBOL, a New Programming Language",
}); err != nil {
	log.Fatalln("Error setting value:", err)
}

// We can also chain the two calls together
if _, err := postsRef.Push(ctx, &Post{
	Author: "alanisawesome",
	Title:  "The Turing Machine",
}); err != nil {
	log.Fatalln("Error pushing child node:", err)
}

Benzersiz anahtar bir zaman damgasına dayanır, bu nedenle liste öğeleri otomatik olarak kronolojik olarak sipariş edilir. Firebase her blog yayını için benzersiz bir anahtar oluşturduğundan, aynı anda birden çok kullanıcı bir posta eklerse yazma çakışması meydana gelmez. Veritabanı verileriniz artık şuna benziyor:

{
  "posts": {
    "-JRHTHaIs-jNPLXOQivY": {
      "author": "gracehop",
      "title": "Announcing COBOL, a New Programming Language"
    },
    "-JRHTHaKuITFIhnj02kE": {
      "author": "alanisawesome",
      "title": "The Turing Machine"
    }
  }
}

JavaScript, Python ve Go'da, push() çağırdıktan sonra hemen set() çağırmak o kadar yaygındır ki Firebase SDK, push() öğesine doğrudan set() verileri doğrudan push() aşağıdaki gibi geçirerek birleştirmenizi sağlar:

Java
// No Java equivalent
node.js
// This is equivalent to the calls to push().set(...) above
postsRef.push({
  author: "gracehop",
  title: "Announcing COBOL, a New Programming Language"
});
piton
# This is equivalent to the calls to push().set(...) above
posts_ref.push({
    'author': 'gracehop',
    'title': 'Announcing COBOL, a New Programming Language'
})
Git
if _, err := postsRef.Push(ctx, &Post{
	Author: "gracehop",
	Title:  "Announcing COBOL, a New Programming Language",
}); err != nil {
	log.Fatalln("Error pushing child node:", err)
}

Push () ile oluşturulan benzersiz anahtarın elde edilmesi

push() çağırmak, anahtarı almak veya veriyi ayarlamak için kullanabileceğiniz yeni veri yoluna bir başvuru döndürür. Aşağıdaki kod, yukarıdaki örnekle aynı verilere neden olacaktır, ancak şimdi oluşturulan benzersiz anahtara erişebileceğiz:

Java
// Generate a reference to a new location and add some data using push()
DatabaseReference pushedPostRef = postsRef.push();

// Get the unique ID generated by a push()
String postId = pushedPostRef.getKey();
node.js
// Generate a reference to a new location and add some data using push()
var newPostRef = postsRef.push();

// Get the unique key generated by push()
var postId = newPostRef.key;
piton
# Generate a reference to a new location and add some data using push()
new_post_ref = posts_ref.push()

# Get the unique key generated by push()
post_id = new_post_ref.key
Git
// Generate a reference to a new location and add some data using Push()
newPostRef, err := postsRef.Push(ctx, nil)
if err != nil {
	log.Fatalln("Error pushing child node:", err)
}

// Get the unique key generated by Push()
postID := newPostRef.Key

Gördüğünüz gibi, benzersiz anahtarın değerini push() referansınızdan alabilirsiniz.

Verileri Alma ile ilgili bir sonraki bölümde, bu verilerin bir Firebase veritabanından nasıl okunacağını öğreneceğiz.

İşlem Verilerini Kaydetme

Artımlı sayaçlar gibi eşzamanlı değişikliklerle bozulabilecek karmaşık verilerle çalışırken, SDK bir işlem işlemi sağlar .

Java ve Node.js'de işlem işlemine iki geri çağrı verirsiniz: bir güncelleme işlevi ve isteğe bağlı bir tamamlama geri çağrısı. Python ve Go'da işlem işlemi engellenir ve bu nedenle yalnızca güncelleme işlevini kabul eder.

Güncelleme fonksiyonu, verilerin mevcut durumunu bir argüman olarak alır ve yazmak istediğiniz yeni durumu döndürmelidir. Örneğin, belirli bir blog gönderisindeki yukarı oyların sayısını artırmak istiyorsanız, aşağıdaki gibi bir işlem yazabilirsiniz:

Java
DatabaseReference upvotesRef = ref.child("server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes");
upvotesRef.runTransaction(new Transaction.Handler() {
  @Override
  public Transaction.Result doTransaction(MutableData mutableData) {
    Integer currentValue = mutableData.getValue(Integer.class);
    if (currentValue == null) {
      mutableData.setValue(1);
    } else {
      mutableData.setValue(currentValue + 1);
    }

    return Transaction.success(mutableData);
  }

  @Override
  public void onComplete(
      DatabaseError databaseError, boolean committed, DataSnapshot dataSnapshot) {
    System.out.println("Transaction completed");
  }
});
node.js
var upvotesRef = db.ref("server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes");
upvotesRef.transaction(function (current_value) {
  return (current_value || 0) + 1;
});
piton
def increment_votes(current_value):
    return current_value + 1 if current_value else 1

upvotes_ref = db.reference('server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes')
try:
    new_vote_count = upvotes_ref.transaction(increment_votes)
    print('Transaction completed')
except db.TransactionAbortedError:
    print('Transaction failed to commit')
Git
fn := func(t db.TransactionNode) (interface{}, error) {
	var currentValue int
	if err := t.Unmarshal(&currentValue); err != nil {
		return nil, err
	}
	return currentValue + 1, nil
}

ref := client.NewRef("server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes")
if err := ref.Transaction(ctx, fn); err != nil {
	log.Fatalln("Transaction failed to commit:", err)
}

Yukarıdaki örnek, sayacın null olup olmadığını veya henüz artırılmadığını kontrol eder, çünkü varsayılan değer yazılmadıysa işlemler null ile çağrılabilir.

Yukarıdaki kod bir işlem işlevi olmadan çalıştırılmışsa ve iki istemci aynı anda artırmayı denediyse, her ikisi de 1 değerini yeni değer olarak yazar ve iki yerine bir artışla sonuçlanır.

Ağ Bağlantısı ve Çevrimdışı Yazma

Firebase Node.js ve Java istemcileri, etkin verilerin kendi dahili sürümlerini korur. Veriler yazıldığında, önce bu yerel sürüme yazılır. Müşteri daha sonra bu verileri veritabanıyla ve diğer istemcilerle "en iyi çaba" temelinde senkronize eder.

Sonuç olarak, veritabanına yapılan tüm yazma işlemleri, veritabanına herhangi bir veri yazılmadan hemen önce yerel olayları tetikler. Bu, Firebase kullanarak bir uygulama yazdığınızda, uygulamanızın ağ gecikmesine veya İnternet bağlantısına bakılmaksızın duyarlı kalacağı anlamına gelir .

Bağlantı yeniden kurulduktan sonra, istemcinin herhangi bir özel kod yazmak zorunda kalmadan mevcut sunucu durumuna "yetişmesi" için uygun olay kümesini alırız.

Verilerinizin Güvenliğini Sağlama

Firebase Gerçek Zamanlı Veritabanı, hangi kullanıcıların verilerinizin farklı düğümlerine okuma ve yazma erişimi olduğunu tanımlamanızı sağlayan bir güvenlik diline sahiptir. Bununla ilgili daha fazla bilgiyi Verilerinizi Güvenli'den alabilirsiniz .