Firebase getter方法和命名约定

时间:2017-12-30 18:49:38

标签: android firebase firebase-realtime-database

我第一次尝试使用Firebase,遇到了一些问题。 仅当getter方法适合变量名称或成员变量是公共的时,才能从我的Firebase存储/数据库中获取数据。但是我对成员变量的命名约定是mVariableName,并且我从我的getter方法名称中留下了“m”。现在我有几个问题:

将模型成员变量公开作为一个可行的选择还是那种不好的做法? 这里命名的最佳方法是什么?我应该命名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-convention时才有效,这很丑陋):

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

2 个答案:

答案 0 :(得分:4)

最佳做法是使用标准POJO或Plain Old Java Object。如果你这样做,Firebase就会让你失望:

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

修改,请使用此课程:

my_reactive_expr <- reactive({ 
    if(!input$button1) return(input$some_numbers)
    input$button1 
  })

答案 1 :(得分:2)

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

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

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

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

另见:

相关问题