我第一次尝试使用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;
}
}
答案 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的答案中)。
另见: