2017-10-23 1 views
0

제목에서 알 수 있듯이 Firebase 데이터베이스 작업을 시도 할 때 그 오류가 발생했습니다. 나는 수많은 해결책을 온라인으로 찾아 냈다 시도했다 그러나 아무것도 나를 위해 일한 것을 보이지 않는다. 아래에서 내 코드와 stackOverflow에 게시하기 전에 지금까지 시도한 내용에 관한 간략한 정보를 찾을 수 있습니다.Firebase "no such instance field"오류

코드는 다음

package com.example.vlad.restaurantorder; 

import android.app.ProgressDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.example.vlad.restaurantorder.Model.User; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 
import com.rengwuxian.materialedittext.MaterialEditText; 

public class LogIn extends AppCompatActivity { 
    EditText editPhone, editPassword; 
    Button btnLogIn; 
    FirebaseDatabase database; 
    DatabaseReference tableUser; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_log_in); 

    btnLogIn = (Button)findViewById(R.id.btnLogInScreenLogIn); 
    editPhone = (MaterialEditText)findViewById(R.id.edtPhone); 
    editPassword = (MaterialEditText)findViewById(R.id.edtPassword); 

    //database 
    database = FirebaseDatabase.getInstance(); 
    tableUser = database.getReference("User"); 

    btnLogIn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      final ProgressDialog progressDialog = new ProgressDialog(LogIn.this); 
      progressDialog.setMessage("Please wait..."); 
      progressDialog.show(); 

      tableUser.addValueEventListener(new ValueEventListener() { 

       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        if(dataSnapshot.child(editPhone.getText().toString()).exists()){ 
         progressDialog.dismiss(); 
         User user = dataSnapshot.child(editPhone.getText().toString()).getValue(User.class); 
         if(user.getPassword().equals(editPassword.getText().toString())){ 

          Toast.makeText(getApplicationContext(), "You are logged in!", Toast.LENGTH_SHORT).show(); 
         } 
         else{ 

          Toast.makeText(getApplicationContext(), "Log in failed!", Toast.LENGTH_SHORT).show(); 
         } 
        } 
        else { 
         progressDialog.dismiss(); 
         Toast.makeText(getApplicationContext(), "User does not exists!", Toast.LENGTH_SHORT).show(); 
        } 

       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 
    }); 


} 

}

내가 여기에 게시하기 전에 지금까지 시도 무엇

: 난독 화를 해제하고} {디버그 build.gradle에 거짓에 minifyEnable를 넣어; 안드로이드 스튜디오를 다시 시작하면 다른 사람들의 게시물도 읽었으므로 문제가 발생했습니다. 내가 사용했던 라인에서 tableUser = database.getReference("User"); 나는 또한 사용을 시도했다 tableUser = database.getReference().child("User");

어떤 도움을 많이 주시면 감사하겠습니다. 로그인 활동 XML을 추가하는 것은 :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/login_screen_image" 
tools:context="com.example.vlad.restaurantorder.LogIn"> 


<LinearLayout 
    android:orientation="vertical" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_centerInParent="true" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <com.rengwuxian.materialedittext.MaterialEditText 
     android:id="@+id/edtPhone" 
     android:hint="Phone Number" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textColorHint="@android:color/white" 
     android:text="0293292442" 
     android:textColor="@android:color/white" 
     android:textSize="34sp" 
     android:inputType="phone" 
     app:met_floatingLabel="highlight" 
     app:met_baseColor="@android:color/white" 
     app:met_maxCharacters="11" 
     app:met_primaryColor="@android:color/white" 
     app:met_singleLineEllipsis="true" 
     /> 

    <com.rengwuxian.materialedittext.MaterialEditText 
     android:id="@+id/edtPassword" 
     android:hint="Password" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textColorHint="@android:color/white" 
     android:text="5678" 
     android:textColor="@android:color/white" 
     android:textSize="34sp" 
     android:inputType="textPassword" 
     app:met_floatingLabel="highlight" 
     app:met_baseColor="@android:color/white" 
     app:met_maxCharacters="11" 
     app:met_primaryColor="@android:color/white" 
     app:met_singleLineEllipsis="true" 
     /> 

</LinearLayout> 

<info.hoang8f.widget.FButton 
    android:id="@+id/btnLogInScreenLogIn" 
    android:text="@string/LogIn" 
    android:textColor="@android:color/white" 
    android:layout_marginRight="8dp" 
    android:layout_marginLeft="8dp" 
    android:layout_alignParentBottom="true" 
    android:layout_weight="1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="8dp" 
    app:buttonColor="@color/btnLogIn" 
    app:shadowColor="@android:color/black" 
    app:shadowEnabled="true" 
    app:shadowHeight="5dp" 
    app:cornerRadius="4dp" 
    /> 

나중에 편집 : 로그 캣 이미지 : 그것은 당신의 코드를 보인다

enter image description here

+0

입니까? 예외가 있습니까? –

+0

이후에 무슨 일이 일어날 지 모르겠으므로 제대로 작동하는지 확신 할 수 없습니다. 문제는 "btnLogIn.setOnClickListener (new View.OnClickListener() {"는이 함수 내부에 입력하지 않아도됩니다. 디버깅을 시도했는데 "no such instance"필드가 나타납니다.) – Vlad

+0

Logcat을 추가 할 수 있습니까? –

답변

1

그냥 작동해야 이

나중에 편집

대단히 감사합니다 다른 경고/오류가 나타나지 않으면 잘 처리하십시오. 누락 된 인스턴스 오류/메시지는 Firebase에서 데이터를 읽는 데 약간의 시간이 걸리기 때문에 발생했을 수 있습니다.

ValueEventListener을 추가하면 앱에서 Firebase의 데이터를 "수신"하거나 읽는 데 약간의 시간이 걸립니다. 따라서 아래의 각 if/else 블록에 몇 가지 로그 메시지를 추가하고, 다시 컴파일하고 실행 한 다음 Android Studio에서 Logcat보기를 열고 앱 화면에서 btnLogIn 버튼을 클릭하십시오. 그런 다음 기다리십시오 (인터넷이 장치/에뮬레이터에서 사용 가능하고 Firebase 데이터베이스가 연결되어 있는지 확인하십시오).

Logcat 창에서 onDataChange에 입력 된 if/else 블록에 따라 로그 메시지가 표시되어야합니다. 예컨대 ..... 디버그 라인 D/ANY_TAG: entered onDataChange

코드 : 코드가 작동 디버거에서 "그러한 인스턴스 필드"메시지를 무시하면,

tableUser.addValueEventListener(new ValueEventListener() { 

       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        Log.d("ANY_TAG", "entered onDataChange"); 
        if(dataSnapshot.child(editPhone.getText().toString()).exists()){ 

         Log.d("ANY_TAG", "entered onDataChange/childExists"); 
         progressDialog.dismiss(); 
         User user = dataSnapshot.child(editPhone.getText().toString()).getValue(User.class); 
         if(user.getPassword().equals(editPassword.getText().toString())){ 

          Log.d("ANY_TAG", "entered onDataChange/childExists/equalPassword");  
          Toast.makeText(getApplicationContext(), "You are logged in!", Toast.LENGTH_SHORT).show(); 
         } 
         else{ 
          Log.d("ANY_TAG", "entered onDataChange/childExists/unEqualPasswords"); 
          Toast.makeText(getApplicationContext(), "Log in failed!", Toast.LENGTH_SHORT).show(); 
         } 
        } 
        else { 
         Log.d("ANY_TAG", "entered onDataChange/childDoesNotExist"); 
         progressDialog.dismiss(); 
         Toast.makeText(getApplicationContext(), "User does not exists!", Toast.LENGTH_SHORT).show(); 
        } 

       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
}