2017-12-30 55 views
0

私は初めてFirebaseに手をかけていますが、問題が発生しました。 私のFirebaseストレージ/データベースからデータを取得するのは、getterメソッドが変数名に合っているか、メンバー変数がpublicである場合のみです。しかし、メンバ変数の命名規則はmVariableNameで、getterメソッドの名前から "m"を除いています。今私は複数の質問があります:Firebaseゲッターのメソッドと命名規則

モデルメンバー変数を公開可能なオプションにしていますか、それとも悪い習慣ですか? 名前を付けるのに最適なアプローチは何ですか? 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、または旧来のJavaオブジェクトを使用することです。

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 
} 

編集、このクラスを使用します:あなたはFirebaseは、あなたの方法から抜け出すだろう、それを行う場合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; 
} 

Firebaseを探します。この状況では(:のみ公共分野(およびないゲッター/セッター)とフィールド名と完全に一致するJSONプロパティを作成または作成する必要があります。したがって、大文字にしてください。

Firebaseクライアントは、パラメータのないコンストラクタを探すことによってこのクラスのインスタンスを作成します。この些細なクラスにはコンストラクタがないので、Java/Androidコンパイラはデフォルトのパラメータのないコンストラクタを生成します。独自のコンストラクタを追加した場合は、パラメータのないコンストラクタも追加してください(Supercilexの回答のように)。

も参照してください: