火力地堡@PropertyName不起作用
我使用火力地堡实时数据库在我的应用程序。我有一个这样的模型。
class Item {
int mItemName;
// Simplified for brevity
}
现在,这个字段在我的实时数据库中存储为itemName
。但我不想使用该命名约定。我想命名模式是这样的,item_name
。
我所做
我用@PropertyName( “ITEM_NAME”)这样的字段上方,
class Item {
@PropertyName("item_name")
int mItemName;
// Simplified for brevity
}
技术问题
火力地堡似乎只是忽略完全注释。我无法更改序列化和反序列化的属性名称。
任何帮助将不胜感激。
编辑
这里是备受关注的完整模型类,
public class FileModel {
@PropertyName("file_id")
String mFileId;
@PropertyName("file_name")
String mOriginalFileName;
@PropertyName("file_path")
String mFilePath;
@PropertyName("file_type")
String mFileType;
@PropertyName("last_modified")
Long mFileLastModified;
@PropertyName("file_size")
String mFileSize;
@Exclude
private boolean mIsSelected;
/**
* Must have empty constructor for JSON deserialization by Firebase
*/
public FileModel() {
}
public FileModel(String fileId, String originalFileName,
String filePath, String fileType, Long fileLastModified, String fileSize) {
this.mFileId = fileId;
this.mOriginalFileName = originalFileName;
this.mFilePath = filePath;
this.mFileType = fileType;
this.mFileLastModified = fileLastModified;
this.mFileSize = fileSize;
}
public String getFileId() {
return mFileId;
}
public void setFileId(String fileId) {
this.mFileId = fileId;
}
public String getOriginalFileName() {
return mOriginalFileName;
}
public void setOriginalFileName(String originalFileName) {
this.mOriginalFileName = originalFileName;
}
public String getFilePath() {
return mFilePath;
}
public void setFilePath(String filePath) {
this.mFilePath = filePath;
}
public String getFileType() {
return mFileType;
}
public void setFileType(String fileType) {
this.mFileType = fileType;
}
public Long getFileLastModified() {
return mFileLastModified;
}
public void setFileLastModified(Long fileLastModified) {
this.mFileLastModified = fileLastModified;
}
public String getFileSize() {
return mFileSize;
}
public void setFileSize(String fileSize) {
this.mFileSize = fileSize;
}
public boolean getIsSelected() {
return mIsSelected;
}
public void setIsSelected(boolean isSelected) {
this.mIsSelected = isSelected;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FileModel model = (FileModel) o;
if (mIsSelected != model.mIsSelected) return false;
if (mFileId != null ? !mFileId.equals(model.mFileId) : model.mFileId != null) return false;
if (mOriginalFileName != null ? !mOriginalFileName.equals(model.mOriginalFileName) : model.mOriginalFileName != null)
return false;
if (mFilePath != null ? !mFilePath.equals(model.mFilePath) : model.mFilePath != null)
return false;
if (mFileType != null ? !mFileType.equals(model.mFileType) : model.mFileType != null)
return false;
if (mFileLastModified != null ? !mFileLastModified.equals(model.mFileLastModified) : model.mFileLastModified != null)
return false;
return mFileSize != null ? mFileSize.equals(model.mFileSize) : model.mFileSize == null;
}
@Override
public int hashCode() {
int result = mFileId != null ? mFileId.hashCode() : 0;
result = 31 * result + (mOriginalFileName != null ? mOriginalFileName.hashCode() : 0);
result = 31 * result + (mFilePath != null ? mFilePath.hashCode() : 0);
result = 31 * result + (mFileType != null ? mFileType.hashCode() : 0);
result = 31 * result + (mFileLastModified != null ? mFileLastModified.hashCode() : 0);
result = 31 * result + (mFileSize != null ? mFileSize.hashCode() : 0);
result = 31 * result + (mIsSelected ? 1 : 0);
return result;
}
@Override
public String toString() {
return "FileModel{" +
"mFileId='" + mFileId + '\'' +
", mOriginalFileName='" + mOriginalFileName + '\'' +
", mFilePath='" + mFilePath + '\'' +
", mFileType='" + mFileType + '\'' +
", mFileLastModified=" + mFileLastModified +
", mFileSize='" + mFileSize + '\'' +
", mIsSelected=" + mIsSelected +
'}';
}
}
终于有机会来解决这个问题。感谢@hatboysam的建议。
唯一的问题是,@PropertyName
注释未在Firebase中正确记录。
是必要的第一件事是场必须公共否则,注释将无法正常工作,这是很明显的/
现在注释考虑到这两个字段的名称以及吸气剂/ setter名称进行序列化。我也遇到了这样的问题,即字段以及getter/setter被序列化,导致重复的ket/value对。
我通过使用字段名称上的注释公开并忽略了吸气器/设置器解决了问题。这完美地解决了这个问题。不是数据用我想要的属性名正确序列化,也没有重复的数据问题。
下面是一个简单的例子,
class Item {
@PropertyName("item_no")
int mItemNo;
// Simplified for brevity
@Exclude
public int getItemNo(){
return mItemNo;
}
@Exclude
public void setItemNo(int itemNo){
this.mItemNo = itemNo;
}
}
那么你不需要获得者和设置者,如果该字段是公开的 – Devrim
我喜欢让getters/setter而不是访问任何公共领域。有时我需要在这些访问器方法中进行格式更改。 –
可怜的firebase doc ..你拯救了我的一周..谢谢Dude .. –
或者只是标记与@PropertyName
你的干将,而不是注释性本身 - 这种方式,您可以保持性能的隐私,提供自定义名称:
public class User extends Object {
private String mDisplayName;
@PropertyName("userName")
public String getDisplayName() {
return mDisplayName;
}
@PropertyName("userName")
public void setDisplayName(String displayName) {
mDisplayName = displayName;
}
}
解决方案对于Kotlin数据分类:
data class Pojo (@get:PropertyName("fieldName") @set:PropertyName("fieldName") var field: String = "")
什么版本的Firebase Databa你是否包含在你的build.gradle文件中? –
如果你的课堂'公共'?这个领域是公开的吗?没有这两个,它将不会被序列化为JSON。 –
我使用的是最新版本9.2.1。类和字段都是公共的,并且它们也是序列化的,只是更改属性名称的注释不受尊重。 –