2017-12-30 43 views
0

Ich versuche meine Hände auf Firebase zum ersten Mal und ich stieß auf ein Problem. Das Abrufen von Daten aus meinem Firebase-Speicher/Datenbank funktioniert nur, wenn die Getter-Methode dem Variablennamen entspricht oder die Mitgliedsvariablen öffentlich sind. Aber meine Namenskonvention für Member-Variablen ist mVariableName und ich lasse "M" aus meinem Getter-Methoden-Namen. Jetzt habe ich mehrere Fragen:Firebase Getter-Methoden und Namenskonvention

Macht die Modellmitgliedsvariablen Öffentlichkeit eine gangbare Wahl oder ist diese schlechte Praxis? Was ist der beste Ansatz hier für die Benennung? Sollte ich die Getter-Methoden getmName benennen oder sollte ich das "m" aus den Namen der Mitgliedsvariablen herauslassen? Sollte ich es dann für das ganze Projekt oder nur für diese Klasse ändern? Ich möchte nur wissen, was die besten Praktiken hier sind.

Dies ist die Klasse, die die Einträge lautet:

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) { 
     } 
    }); 
} 
} 

Und das sind die Regeln:

Datenbank:

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

Lagerung:

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

Und die Upload.klasse (Funktioniert nur, wenn entweder Felder sind öffentliche oder Getter-Methode Namen passen m-Konvention, die hässlich ist):

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; 
    } 
} 

Antwort

4

Die beste Vorgehensweise ist es, einen Standard POJO zu verwenden, oder Plain Old Java Object. Wenn Sie das tun, wird Firebase aus dem Weg bekommen:

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 
} 

bearbeiten, diese Klasse verwenden:

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

Ich versuche das, aber auf diese Weise kann ich die Daten aus Firebase nicht lesen. Es funktioniert nur, wenn entweder die Getter-Methodennamen den Variablennamen entsprechen oder die Variablen öffentlich sind:/ –

+0

Es wird funktionieren, haben Sie einen öffentlichen leeren Konstruktor? Im Benutzerfall wäre dies "public User() {}". – SUPERCILEX

+0

Ja, ich habe einen leeren öffentlichen Konstruktor –

1

Als Alternative zu Supercilex‘ausgezeichnete Antwort, können Sie auch eine Klasse verwenden mit nur öffentlichen Bereichen (und nicht die Getter/Setter):

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

In dieser Situation Firebase für aussehen wird (oder erstellen Sie eine JSON-Eigenschaft, die genau mit dem Feldnamen übereinstimmt. Stellen Sie daher sicher, dass Sie die Groß-/Kleinschreibung korrekt eingeben.

Der Firebase-Client erstellt eine Instanz dieser Klasse, indem er nach einem parameterlosen Konstruktor sucht. In dieser trivialen Klasse gibt es keinen Konstruktor, daher generiert der Java/Android-Compiler einen standardmäßigen, parameterlosen Konstruktor für Sie. Wenn Sie einen eigenen Konstruktor hinzufügen, müssen Sie auch einen parameterlosen hinzufügen (wie in der Antwort von Supercilex).

Siehe auch: