【问题标题】:Firebase getter methods and naming conventionFirebase getter 方法和命名约定
【发布时间】:2018-06-10 17:42:42
【问题描述】:

我第一次尝试使用 Firebase,但遇到了一些问题。 只有当 getter 方法适合变量名称或成员变量是公共的时,才能从我的 Firebase 存储/数据库中获取数据。但是我对成员变量的命名约定是mVariableName,我将“m”从我的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(仅当任一字段为公共字段或 getter 方法名称符合 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;
    }
}

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    作为 Supercilex 出色答案的替代方案,您还可以使用具有 only 公共字段(而不是 getter/setter)的类:

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

    在这种情况下,Firebase 将查找(或创建)与字段名称完全匹配的 JSON 属性,因此请确保正确大写。

    Firebase 客户端通过查找无参数构造函数来创建此类的实例。在这个平凡的类中没有构造函数,因此 Java/Android 编译器将为您生成一个默认的、无参数的构造函数。如果您添加自己的构造函数,请务必添加一个无参数的构造函数(如 Supercilex 的答案)。

    另见:

    【讨论】:

      【解决方案2】:

      最佳做法是使用标准的POJO 或普通旧Java 对象。如果您这样做,Firebase 将不会妨碍您:

      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
      }
      

      编辑,使用这个类:

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

      【讨论】:

      • 我尝试过,但这样我无法从 Firebase 中读取数据。它仅在 getter 方法名称适合变量名称或变量是公共变量时才有效:/
      • 它会工作的,你有一个公共的空构造函数吗?在用户案例中,它将是public User() {}
      • 是的,我有一个空的公共构造函数
      • 那么它可能与您的安全规则或您的客户端代码有关。可以发一下吗?
      • 我设置了规则,所以每个人都可以访问它。但它只有在 getter 方法的名称匹配时才有效
      猜你喜欢
      • 2011-03-13
      • 2012-12-13
      • 1970-01-01
      • 2011-02-26
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多