我正在使用Firebase Android SDK并且对发送同步请求而不是异步感兴趣.根据文档,在任何请求中都会显示回调.但是同步性呢?
谢谢!
我正在尝试使用通过Firebase连接的对等方获取的数据来更新我的Android应用中的WebView部分.为此,执行将返回所需数据的阻塞操作可能会有所帮助.例如,Chat示例的实现将等待另一个聊天参与者在push.setValue()返回之前写入某些内容.Firebase可以实现这样的行为吗?
我需要存储他自己异步的FireBase getValue方法的结果.我不能使用类似"onPostExecute()"的东西,为了我的目的,我无法执行"onDataChange()"的所有操作,因为我需要在将来的其他活动中引用一些参考.
这是我的片段检索数据:
List<Village> villages = new LinkedList<>();
Firebase ref = new Firebase("MYFIREBASEURL").child("village");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
spinnerArray.clear();
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
Village v = postSnapshot.getValue(Village.class);
villages.add(v);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
Run Code Online (Sandbox Code Playgroud)
如果我尝试从"onDataChange"中读取村庄,我自然会为他的异步生活读取空值.有一种方法可以确保调用onDataChange吗?
android synchronization asynchronous firebase firebase-realtime-database
在将新数据添加到 Firestore 之前,我想检查数据库中是否存在相同类型的数据。如果已经存在数据意味着我想防止用户在数据库中输入重复数据。在我的情况下,如果已经存在同一时间的预订,它就像预约预订,我想防止用户在同一时间预订。我尝试使用查询功能,但它不能防止重复数据输入。请帮助我
private boolean alreadyBooked(final String boname, final String bodept, final String botime) {
final int[] flag = {0};
CollectionReference cref=db.collection("bookingdetails");
Query q1=cref.whereEqualTo("time",botime).whereEqualTo("dept",bodept);
q1.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (DocumentSnapshot ds : queryDocumentSnapshots) {
String rname, rdept, rtime;
rname = ds.getString("name");
rdept = ds.getString("dept");
rtime = ds.getString("time");
if (rdept.equals(botime)) {
if (rtime.equals(botime)) {
flag[0] = 1;
return;
}
}
}
}
});
if(flag[0]==1){
return true;
}
else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Semaphore等待我的firebase valueEventListener.我有一个用户信息活动,有6个不同的字段,用户必须填写.当用户保存他/她的信息时,我想进行"全有或全无"类型的检查.某些用户信息无法复制...例如用户名,电子邮件和电话号码.我正在使用firebase,目前一般的想法是这样的格式:
void saveUserInfo(){
if(field1 exist in database){
return;
}
.
.
.
if(field6 exist in database){
return;
}
savefield1();
.
.
.
savefield6();
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是检查数据库中是否已存在该值的方法.这是我目前的方法:
public boolean alreadyInUse(String key, String value) throws InterruptedException {
final StringBuilder done = new StringBuilder("");
final Semaphore semaphore = new Semaphore(0);
mDatabase.child(key).child(value).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String result = dataSnapshot.getValue(String.class);
if(result == null){
Log.d("WorkoutLog", "result: null");
done.append("false");
semaphore.release();
return;
}
else if(result.equals(uID)){
Log.d("WorkoutLog", "result: " + result.toString());
done.append("false");
semaphore.release();
return; …Run Code Online (Sandbox Code Playgroud) android asynchronous semaphore firebase firebase-realtime-database
public List<String> getContactsFromFirebase(){
FirebaseDatabase.getInstance().getReference().child("Users")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Users user = snapshot.getValue(Users.class);
assert user != null;
String contact_found = user.getPhone_number();
mContactsFromFirebase.add(contact_found);
Log.i("Test", mContactsFromFirebase.toString());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return mContactsFromFirebase;
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到错误.在上面的代码中,当我调用日志时,我从中获取值mContactsFromFirebase,但该getContactsFromFirebase()方法返回一个空列表.请问你能帮帮我吗?
在我的一项Android活动中,我需要对Firebase执行多个查询,以最终向用户展示一些内容。
总之,我需要签入“ 用户”引用以检查他当前处于哪个课程步骤,然后我需要阅读课程内容以进行加载。
我目前正在做的是,我有两个像这样的嵌套侦听器:
ref1.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ref2.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//do the work
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
当您顺序需要它们时,是否有更好的方法来执行此查询?
我想从addValueEventListener()我用来从数据库Firebase转售数据的方法中收到一个字符串.数据正确到达.
但是当确定从该方法中获取字符串以在另一个方法中使用它时,它什么也不返回.
你有提示吗?
我已经尝试过putExtras并且还有意创建了一个方法,但它没有用.
final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year");
mPostReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final ArrayList<String> labels = new ArrayList<String>();
for (DataSnapshot data : dataSnapshot.getChildren()){
final DailyItem dailyItem = data.getValue(DailyItem.class);
labels.add(dailyItem.mese);
}
title.setText(labels.get(position));
a = title.getText().toString();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(view.getContext(),"database error",
Toast.LENGTH_SHORT).show();
}
});
//this return null... why?
String title = a;
Run Code Online (Sandbox Code Playgroud) 我试图从Firebase数据库中获取一个特定的值,之前我做过,但现在当我尝试一些不同的东西时,它说"无法从具有void结果类型的方法返回值".
我猜我错过了一些编程规则,因为我是一名新的Java程序员.
这是我的代码:
public int getVotesForEvent(final String event_title) {
firebaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.child("Votes").exists()) {
for (DataSnapshot event : dataSnapshot.child("Votes").getChildren()) {
String event_title2 = event.getKey();
if (event_title2.equals(event_title)) {
int count=Integer.parseInt(event.getValue().toString());
return count;
}
}
}
else {
int count = 0 ;
return count;
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
错误出现在我试图返回计数的地方.
读完注释后,这是我的代码,现在该方法不会影响声明的变量计数,它保持0:
int count=0;
public int getVotesForEvent(final String event_title) {
firebaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) { …Run Code Online (Sandbox Code Playgroud)