Mit einer alten Firebase (com.firebase:firebase-client-android:2.5.2
) können wir dies tun:Wie machst du Tricks in einem alten Firebase mit JsonAutoDetect?
@JsonAutoDetect(
fieldVisibility = JsonAutoDetect.Visibility.ANY,
isGetterVisibility = JsonAutoDetect.Visibility.NONE,
getterVisibility = JsonAutoDetect.Visibility.NONE,
setterVisibility = JsonAutoDetect.Visibility.NONE)
public class BaseForEveryDataClass {
//some library staff
}
Diese uns diese Tricks zu tun erlaubt:
public class Identity extends BaseForEveryDataClass {
private String id;
public String getId(){
return id;
};
//(1) protect id from change, get it internally from firebase
}
public class Movie extends Identity {
//(2) Firebase was detecting the id field for all ancestors of identity
private String imdbId;
public Movie(JSONObject json/*ApiResponse*/) {
imdbId = json.getString("imdb"); //no setter, cannot change it outside
}
//(3) no getter for imdbId - it useless by itself, but have to be stored in a db
//(4) I don't need field "imdbLink" stored in a db, it's calculated
public String getImdbLink() {
return Constants.IMDB_PREFIX+imdbId;
}
}
public class User extends Identity {
//(2) no id field again in a Google-Firebase
//(3) another completely hidden field
private long remindToRateUs = 0;
public boolean shouldShowRateDialog() {
return remindToRateUs < System.currentTimeInMillis();
}
public void remindLater() {
remindToRateUs = System.currentTimeInMillis() + Constants.MONTH;
}
}
dieses in Firebase 2.5 funktioniert also, aber ich kann einen Weg nicht finden tun sie es einfach und sicher in Firebase 9 (Google-enhanced, com.google.firebase:firebase-database:9.0.2
)
So die Fragen:
(1 + 2) Ist es eine Möglichkeit, alle privaten Felder in allen Basisklassen und der beibehaltenen Klasse beizubehalten, wie in einem alten analogen Firebase? Ich weiß, wir können Abhilfe, die mit
//inside all ancestors
public int getId() {
super.getId();
}
aber es ist sehr nicht fehlersicher und nur unnötige Mehrarbeit;
(3) Wie können interne Felder nach dem Upgrade von Google dauerhaft ausgeblendet werden? Die Problemumgehung besteht darin, extern sichtbare Getter und/oder Setter für sie hinzuzufügen. Aber das macht Ihre Datenklasse anfällig für Hacker von außen und verletzt die Kapselung.
(4) wie können Sie Persistenz von ALLE „Utility-Getter“ deaktivieren (Getter ohne Sicherung der realen Datenfeld, Laufzeit berechnet) auf einmal ohne JsonAutoDetect? Ich weiß, dass wir @Exclude zu jedem von ihnen hinzufügen können. Jeder von ihnen, Carl!
@Google, warum ??? O_o Es hat gut funktioniert!
Danke für die Optionen. Mir geht es gut, abhängig von Jackson. Aber ich kann mir wirklich nicht vorstellen, dass eine Basismethode in einer Root-Basisklasse einmal erstellt wird und nicht an jeder Stelle kopiert wird, an der ich Daten benötige. –
Tut mir leid, ich kann es nicht als Antwort akzeptieren, weil es keine meiner Fragen beantwortet. –