Firebase에서 push()를 사용할 때 고유 ID를 가져오는 방법
Firebase 데이터베이스에서 항목을 추가/제거하려고 합니다.추가/수정/제거(프론트 엔드)할 테이블에 목록을 표시하고 싶지만, 수정/제거를 위해 각 항목을 고유하게 식별할 수 있는 방법이 필요합니다.Firebase는 push()를 사용할 때 기본적으로 고유 식별자를 추가하지만 API 설명서에서 이 고유 식별자를 선택하는 방법을 참조하는 내용을 보지 못했습니다.이게 가능할까요?고유 ID를 만들기 위해 set()을 대신 사용해야 합니까?
이들의 튜토리얼을 사용하여 다음과 같은 간단한 예를 정리했습니다.
<div id='messagesDiv'></div>
<input type='text' class="td-field" id='nameInput' placeholder='Name'>
<input type='text' class="td-field" id='messageInput' placeholder='Message'>
<input type='text' class="td-field" id='categoryInput' placeholder='Category'>
<input type='text' class="td-field" id='enabledInput' placeholder='Enabled'>
<input type='text' class="td-field" id='approvedInput' placeholder='Approved'>
<input type='Button' class="td-field" id='Submit' Value="Revove" onclick="msgRef.remove()">
<script>
var myDataRef = new Firebase('https://unique.firebase.com/');
$('.td-field').keypress(function (e) {
if (e.keyCode == 13) {
var name = $('#nameInput').val();
var text = $('#messageInput').val();
var category = $('#categoryInput').val();
var enabled = $('#enabledInput').val();
var approved = $('#approvedInput').val();
myDataRef.push({name: name, text: text, category: category, enabled: enabled, approved: approved });
$('#messageInput').val('');
}
});
myDataRef.on('child_added', function(snapshot) {
var message = snapshot.val();
displayChatMessage(message.name, message.text, message.category, message.enabled, message.approved);
});
function displayChatMessage(name, text, category, enabled, approved, ) {
$('<div/>').text(text).prepend($('<em/>').text(name+' : '+category +' : '+enabled +' : '+approved+ ' : ' )).appendTo($('#messagesDiv'));
$('#messagesDiv')[0].scrollTop = $('#messagesDiv')[0].scrollHeight;
};
</script>
이제 세 줄의 데이터가 있다고 가정하겠습니다.
fred : 1 : 1 : 1 : test message 1
fred : 1 : 1 : 1 : test message 2
fred : 1 : 1 : 1 : test message 3
2열을 고유하게 식별하려면 어떻게 해야 합니까?
Firebase 데이터베이스에서는 다음과 같이 표시됩니다.
-DatabaseName
-IuxeSuSiNy6xiahCXa0
approved: "1"
category: "1"
enabled: "1"
name: "Fred"
text: "test message 1"
-IuxeTjwWOhV0lyEP5hf
approved: "1"
category: "1"
enabled: "1"
name: "Fred"
text: "test message 2"
-IuxeUWgBMTH4Xk9QADM
approved: "1"
category: "1"
enabled: "1"
name: "Fred"
text: "test message 3"
이 질문을 찾고 사용하는 모든 사람에게Firebase 3+
푸시 후 자동 생성된 개체 고유 ID를 얻는 방법은key
약속 스냅샷의 속성(메소드가 아님):
firebase
.ref('item')
.push({...})
.then((snap) => {
const key = snap.key
})
참고로, 자신만의 고유한 ID를 생성하는 것을 고려하는 사람들은 그것에 대해 다시 생각해야 합니다.보안 및 성능에 영향을 미칠 수 있습니다.잘 모르겠으면 파이어베이스의 아이디를 사용하세요.타임스탬프가 포함되어 있으며 기본 제공되는 몇 가지 깔끔한 보안 기능이 있습니다.
자세한 내용은 여기에서 확인하십시오.
push()에 의해 생성된 고유 키는 현재 시간순으로 정렬되므로 결과 항목 목록이 시간순으로 정렬됩니다.또한 키는 추측할 수 없도록 설계되었습니다(엔트로피의 72개 랜덤 비트 포함).
스냅샷의 "이름"(이 경우 push()로 생성된 ID)를 가져오려면 다음과 같이 name()을 호출합니다.
var name = snapshot.name();
push()에 의해 자동 생성된 이름을 가져오려면 반환된 참조에서 다음과 같이 name()을 호출하면 됩니다.
var newRef = myDataRef.push(...);
var newID = newRef.name();
참고: snapshot.name()
더 이상 사용되지 않습니다.다른 답변을 참조하십시오.
snapshot.name()
더 이상 사용되지 않습니다.사용하다key
대신.그key
모든 DataSnapshot의 속성(Firebase의 루트를 나타내는 속성 제외)은 해당 속성을 생성한 위치의 키 이름을 반환합니다.예를 들어, 다음과 같습니다.
myDataRef.on('child_added', function(snapshot) {
var message = snapshot.val();
var id = snapshot.key;
displayChatMessage(message.name, message.text, message.category, message.enabled, message.approved);
});
갖기 위해uniqueID
끝나고push()
다음 변형을 사용해야 합니다.
// 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;
새 항목을 생성합니다.Ref
너가 언제push()
및 사용.key
당신이 얻을 수 있는 이 심판의.uniqueID
.
@ @Rima ,key()
는 사용자의 가방간법은한 ID 것기할는입다니당하을반벽방화에 입니다.push()
.
그러나 중간자를 배제하고 싶다면 파이어베이스는 ID 생성 코드가 포함된 요지를 공개했습니다.이는 단순히 현재 시간의 기능으로, 서버와 통신하지 않고도 고유성을 보장하는 방식입니다.
, 당은을 사용할 수 있습니다.generateId(obj)
그리고.set(obj)
의 합니다.push()
/**
* Fancy ID generator that creates 20-character string identifiers with the following properties:
*
* 1. They're based on timestamp so that they sort *after* any existing ids.
* 2. They contain 72-bits of random data after the timestamp so that IDs won't collide with other clients' IDs.
* 3. They sort *lexicographically* (so the timestamp is converted to characters that will sort properly).
* 4. They're monotonically increasing. Even if you generate more than one in the same timestamp, the
* latter ones will sort after the former ones. We do this by using the previous random bits
* but "incrementing" them by 1 (only in the case of a timestamp collision).
*/
generatePushID = (function() {
// Modeled after base64 web-safe chars, but ordered by ASCII.
var PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';
// Timestamp of last push, used to prevent local collisions if you push twice in one ms.
var lastPushTime = 0;
// We generate 72-bits of randomness which get turned into 12 characters and appended to the
// timestamp to prevent collisions with other clients. We store the last characters we
// generated because in the event of a collision, we'll use those same characters except
// "incremented" by one.
var lastRandChars = [];
return function() {
var now = new Date().getTime();
var duplicateTime = (now === lastPushTime);
lastPushTime = now;
var timeStampChars = new Array(8);
for (var i = 7; i >= 0; i--) {
timeStampChars[i] = PUSH_CHARS.charAt(now % 64);
// NOTE: Can't use << here because javascript will convert to int and lose the upper bits.
now = Math.floor(now / 64);
}
if (now !== 0) throw new Error('We should have converted the entire timestamp.');
var id = timeStampChars.join('');
if (!duplicateTime) {
for (i = 0; i < 12; i++) {
lastRandChars[i] = Math.floor(Math.random() * 64);
}
} else {
// If the timestamp hasn't changed since last push, use the same random number, except incremented by 1.
for (i = 11; i >= 0 && lastRandChars[i] === 63; i--) {
lastRandChars[i] = 0;
}
lastRandChars[i]++;
}
for (i = 0; i < 12; i++) {
id += PUSH_CHARS.charAt(lastRandChars[i]);
}
if(id.length != 20) throw new Error('Length should be 20.');
return id;
};
})();
Object를 는 반환객된사용하는약속다니.하여 할 수 ..then()
에 .push()
와 함께snapshot.key
:
const ref = Firebase.database().ref(`/posts`);
ref.push({ title, categories, content, timestamp})
.then((snapshot) => {
ref.child(snapshot.key).update({"id": snapshot.key})
});
파이어베이스에서 생성된 고유 키를 가져오려면push()
다른 전화를 걸 필요 없이 데이터베이스에 글을 쓰는 동안 또는 쓴 후 방법은 다음과 같습니다.
var reference = firebaseDatabase.ref('your/reference').push()
var uniqueKey = reference.key
reference.set("helllooooo")
.then(() => {
console.log(uniqueKey)
// this uniqueKey will be the same key that was just add/saved to your database
// can check your local console and your database, you will see the same key in both firebase and your local console
})
.catch(err =>
console.log(err)
});
그push()
에 메드가 .key
데이터베이스에 쓰기 전, 후 또는 쓰는 동안 사용할 수 있는 방금 생성된 키를 제공하는 속성입니다.
사용하다push()
새로운 레퍼런스를 얻기 위해 그리고key
고유한 ID를 얻을 수 있습니다.
var ref = FirebaseDatabase.instance.ref();
var newRef = ref.push(); // Get new key
print(newRef.key); // This is the new key i.e IqpDfbI8f7EXABCma1t
newRef.set({"Demo": "Data"}) // Will be set under the above key
내가 어떻게 했냐면:
FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference ref = mFirebaseDatabase.getReference().child("users").child(uid);
String key = ref.push().getKey(); // this will fetch unique key in advance
ref.child(key).setValue(classObject);
이제 추가로 사용할 수 있도록 키를 보관할 수 있습니다.
언급URL : https://stackoverflow.com/questions/16637035/in-firebase-when-using-push-how-do-i-pull-the-unique-id
'programing' 카테고리의 다른 글
Oracle에서 REGEXP_LIKE가 아님 (0) | 2023.06.29 |
---|---|
Git 분기의 커밋 수 카운트 (0) | 2023.06.29 |
최신 Git commit에서 간단히 패치를 생성하려면 어떻게 해야 합니까? (0) | 2023.06.29 |
상태를 사용하려면 선택기를 사용해야 합니다. (0) | 2023.06.24 |
바로 옆 창에서 데이터 테이블 또는 데이터 보기의 내용을 쉽게 볼 수 있는 방법 (0) | 2023.06.24 |