2017-12-30 17 views
0

처음으로 Firebase를 사용하려고하는데 문제가 발생했습니다. getter 메소드가 변수 이름에 적합하거나 멤버 변수가 public 인 경우에만 Firebase 스토리지/데이터베이스에서 데이터를 가져올 수 있습니다. 그러나 멤버 변수에 대한 내 명명 규칙은 mVariableName이며 getter 메서드 이름에서 "m"을 그대로 둡니다. 이제 여러 질문이 있습니다.Firebase getter 방법 및 명명 규칙

모델 구성원 변수를 공개 옵션으로 만들거나 그 나쁜 습관입니까? 이름을 지정하는 가장 좋은 방법은 무엇입니까? getter 메서드의 이름을 getmName으로하거나 멤버 변수 이름에서 "m"을 그대로 두어야합니까? 전체 프로젝트 또는이 클래스 만 변경해야합니까? 그냥 모범 사례가 무엇인지 알고 싶습니다.

public class ImagesActivity extends AppCompatActivity { 

private RecyclerView mRecyclerView; 
private ImageAdapter mAdapter; 

private FirebaseStorage mFirebaseStorage; 
private DatabaseReference mDatabase; 
private List<Upload> mUploads; 

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

    mRecyclerView = findViewById(R.id.recycler_view); 
    mRecyclerView.setHasFixedSize(true); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 

    mUploads = new ArrayList<>(); 

    mFirebaseStorage = FirebaseStorage.getInstance(); 
    mDatabase = FirebaseDatabase.getInstance().getReference(Constants.DATABASE_PATH_UPLOADS); 

    mDatabase.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       Upload upload = postSnapshot.getValue(Upload.class); 
       Log.i("UPLOAD", "Upload : " + upload.getName()); 
       mUploads.add(upload); 
      } 

      mAdapter = new ImageAdapter(getApplicationContext(), mUploads); 

      mRecyclerView.setAdapter(mAdapter); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 
} 

그리고 이러한 규칙은 다음과 같습니다 :

데이터베이스 :

{ 
    "rules": { 
    ".read": true, 
    ".write": true 
    } 
} 

저장 :

service firebase.storage { 
    match /b/{bucket}/o { 
    match /{allPaths=**} { 
     allow read, write: if true; 
    } 
    } 
} 

그리고

는 항목을 읽는 클래스 Upload.class (중 필드가 공용 또는 게터 메소드 이름은 못생긴 m-규칙을 맞는 경우에만 작동) :

public class Upload { 

    public String mName; 
    public String mImageUrl; 

    public Upload() { 
    } 

    public Upload(String name, String imageUrl) { 
     if (name.trim().equals("")) { 
      name = "No Name"; 
     } 

     mName = name; 
     mImageUrl = imageUrl; 
    } 


    public String getName() { 
     return mName; 
    } 

    public String getImageUrl() { 
     return mImageUrl; 
    } 
} 

답변

4

가장 좋은 방법은 표준 POJO, 또는 일반 올드 자바 객체를 사용하는 것입니다. 당신이 그렇게한다면, 중포 기지 당신의 방법에서 얻을 것이다 :

public final class User { 
    // These names don't matter since they are private, you could call it `glubustufo` 
    // They should always be private 
    private String mName; 
    private String mEmail; 
    // ... 

    // Constructors 

    // Methods should be public and use the get/set convention where the following 
    // words are in CamelCase and will be translated to lowerCamelCase in the db. 
    public String getName() { return mName; } 

    public void setName(String name) { mName = name; } 

    public String getEmail() { return mEmail; } 

    public void setEmail(String email) { mEmail = email; } 

    // equals, hashCode, toString 
} 

편집는,이 클래스를 사용 Supercilex '우수 답변에 대한 대안으로

public final class Upload { 
    private String mName; 
    private String mImageUrl; 

    public Upload() { 
     // Needed for Firebase reflection 
    } 

    public Upload(String name, String imageUrl) { 
     if (name.trim().equals("")) { 
      name = "No Name"; 
     } 

     mName = name; 
     mImageUrl = imageUrl; 
    } 

    public String getName() { 
     return mName; 
    } 

    public void setName(String name) { 
     mName = name; 
    } 

    public String getImageUrl() { 
     return mImageUrl; 
    } 

    public void setImageUrl(String url) { 
     mImageUrl = url; 
    } 
} 
+0

나는 이것을 시도하지만,이 방법으로 나는 Firebase에서 데이터를 읽을 수 없다. getter 메소드 이름이 변수 이름에 맞거나 변수가 public 인 경우에만 작동합니다 :/ –

+0

작동합니다. 공용 비어있는 생성자가 있습니까? 사용자의 경우에는'public User() {}'가됩니다. – SUPERCILEX

+0

그래, 나는 공공 생성자가 비어있다. –

1

을, 당신은 또한 클래스를 사용할 수 있습니다

public final class Upload { 
    public String name; 
    public String imageUrl; 
} 

중포 기지가 모양이 상황에서 (: 공공 분야 (그리고 게터/세터)와 또는 작성) 필드 이름과 정확히 일치하는 JSON 속성을 올바르게 대문자로 사용해야합니다.

Firebase 클라이언트는 매개 변수없는 생성자를 찾아서이 클래스의 인스턴스를 생성합니다. 이 간단한 클래스에는 생성자가 없으므로 Java/Android 컴파일러는 매개 변수가없는 기본 생성자를 생성합니다. 당신 자신의 생성자를 추가한다면, 매개 변수없는 생성자 (Supercilex의 답처럼)도 추가해야합니다.

은 참조 :