2016-07-28 3 views
0

firebase를 처음 사용했습니다. firebase-database에 주어진 형식으로 데이터를 저장하려고합니다 :Firebase- 데이터베이스의 불일치 데이터가 Android 데이터베이스에 저장 중

approot{ 
uid{ 
name:"name" 
add:"add" 
phn:"phn" 
} 
uid2{ 
name:"name" 
add:"add" 
phn:"phn" 
} 
....... 

등등. 이를 위해 나는 다음과 같은 코드를 작성했습니다 :

String phn = inputPhn.getText().toString().trim(); 
     String add = inputAdd.getText().toString().trim(); 
     String name = inputName.getText().toString().trim(); 

     if (TextUtils.isEmpty(name)) { 
      Toast.makeText(getApplicationContext(), "Enter name!", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     if (TextUtils.isEmpty(phn)||phn.length()!=10) { 
      Toast.makeText(getApplicationContext(), "Enter phone no.!", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     if (TextUtils.isEmpty(add)) { 
      Toast.makeText(getApplicationContext(), "Enter address!", Toast.LENGTH_SHORT).show(); 
      return; 
     } 
     //String info="Name:"+name+"\n"+"PhoneNo:"+phn+"\n"+"Adress:"+add+"\n"; 
     String uId=auth.getCurrentUser().getUid(); 
     myref.child(uId).child("name").setValue(name); 
     myref.child(uId).child("add").setValue(add); 
     myref.child(uId).child("phone").setValue(phn); 
     myref.child(uId).child("end").setValue("end"); 
     auth.signOut(); 

내 문제는 내가에 일관성 중포 기지 데이터베이스에서 데이터 저장 얻고 있다는 것입니다. 데이터베이스에 저장된 데이터는 다음과 같습니다.

{ 
    "User" : { 
    "ANj8GLEJS9alW11QYQyF8Rykwyn2" : { 
     "add" : "hzjs", 
     "name" : "hxjx" 
    }, 
    "b0ZBftQ5UOOtTtzkeZHcC0558MC3" : { 
     "add" : "gw", 
     "name" : "hs" 
    }, 
    "eH6rCXzvEncTe163N7KaJ7XEZp52" : { 
     "name" : "dudj" 
    }, 
    "gEqc92Z0mvcfIWvhZu7QOhRcnNQ2" : { 
     "add" : "bsus", 
     "name" : "jziz", 
     "phone" : "1234567890" 
    }, 
    "kGF2PalHrpeFus6682z55p47YBg2" : { 
     "add" : "hdud", 
     "name" : "jdhd" 
    }, 
    "nHRt5n5roGfU3QogVUM09HDBrIw2" : { 
     "add" : "qwerty", 
     "end" : "end", 
     "name" : "q", 
     "phone" : "1234567860" 
    }, 
    "pRRzexjQN1eynoCQcoClNl2TcHk2" : { 
     "add" : "dvjh", 
     "name" : "rhid" 
    }, 
    "vaek3Z4eEVTWmc722T92tfgBwaE3" : { 
     "add" : "dhudvj", 
     "name" : "gsbud" 
    }, 
    "xsH5JoTXftaxicUmvntt0N5hcNJ3" : { 
     "add" : "zhs", 
     "name" : "q" 
    } 
    } 
} 

도와주세요.
편집
나는 firebase 9.2.1을 사용하고 있습니다. 정의 과 규칙은 다음과 같습니다 -

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 
+0

포함 형식 A [CompletionListener] (https://firebase.google.com/docs/reference/android/com/를 사용, setValue의'에 대한 호출은()'실패 이유를 이해하려면 google/firebase/database/DatabaseReference.CompletionListener)'DatabaseError'의 값을 확인하십시오. 버전 9.2.1을 사용하여 결과를 재현 할 수 없습니다. 어떤 버전을 사용하고 있습니까? 모든 쓰기를 허용하도록 설정된 데이터베이스에 대한 보안 규칙이 있습니까? –

+0

@qbix 질문에 추가 된 규칙과 규칙을 편집했습니다. –

+0

'uId'가 자동 생성되었거나 맞춤 'uId'입니까? – triandicAnt

답변

2

당신은 사용자가 로그 아웃하기 전에 signOut가 성공적으로 호출 한 후 인증이 null되기 때문에, 완료 할 setValue 기다려야합니다. setValue이 완료되지 않은 경우 auth이 null이므로 규칙을 위반하게됩니다.

CompletionListener을 사용하여 setValue이 완료되었는지 확인한 다음 안전하게 로그 아웃 할 수 있습니다. 이처럼

Map<String, String> values = new HashMap<>(); 
values.put("name", name); 
values.put("add", add); 
values.put("phone", phn); 
values.put("end", end); 

DatabaseReference.CompletionListener completionListener = new DatabaseReference.CompletionListener() { 
    @Override 
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
     auth.signOut(); 
    } 
}; 
myref.child(uid).setValue(values, completionListener); 
관련 문제