- Forum-Beiträge: 17
26.07.2018, 11:55:38 via Website
26.07.2018 11:55:38 via Website
Hey Leute,
habe einmal ein paar Fragen zur Firebase Database. Hoffentlich könnt ihr mir helfen.
- Meine Database in Firebase erstellt immer einen Zeitstempel wenn ich einen Eintrag hinzufüge. Kann man das nicht auch ohne Zeitstempel erstellen?
Hier mal mein Code:
public class FirebaseHelper {
DatabaseReference db;
String modelName;
Boolean saved=null;
public interface MyCallback {
void onCallback(ArrayList<String> value);
}
public FirebaseHelper(DatabaseReference db, String modelName) {
this.db = db;
this.modelName = modelName;
}
//SAVE
public Boolean save(Words words)
{
if(words ==null)
{
saved=false;
}else
{
try
{
db.child(modelName).push().setValue(words);
saved=true;
}catch (DatabaseException e)
{
e.printStackTrace();
saved=false;
}
}
return saved;
}
//READ
public void retrieve(final MyCallback myCallback)
{
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
myCallback.onCallback(fetchData(dataSnapshot));
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
myCallback.onCallback(fetchData(dataSnapshot));
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private ArrayList<String> fetchData(DataSnapshot snapshot)
{
ArrayList<String> spacecrafts = new ArrayList<>();
for (DataSnapshot ds:snapshot.getChildren())
{
String name=ds.getValue(Words.class).getName();
spacecrafts.add(name);
}
return spacecrafts;
}
}
Mit dieser Methode wird der Eintrag gespeichert:
private void displayInputDialog(final MainActivity.Type selectedType) {
Dialog d=new Dialog(this);
d.setTitle("Firebase Database");
d.setContentView(R.layout.output_layout);
String name=out.getText().toString();
Words s = new Words();
s.setName(name);
//SAVE
if (name != null && name.length() > 0) {
switch (selectedType) {
case WORD: {
if (helper3.save(s)) {
Toast.makeText(MainActivity.this, name + " added successfully\nto the database",
Toast.LENGTH_SHORT).show();
}
break;
}
}
} else {
Toast.makeText(MainActivity.this, "Word Cannot Be Empty", Toast.LENGTH_SHORT).show();
}
}
Und hier dann die Database Struktur die erstellt wird.
{
"1stWord" : {
"1stWord" : {
"-LI125GLPy0-IPAm4GEM" : {
"name" : "test"
},
und so weiter. Beziehungsweise, kann man das noch "schöner", ordentlicher aufbauen/strukturieren?
Habe eine App, die aus zwei Wörtern ein neues Wort generieren soll.
Es stehen also zwei Datenbankeinträge bereit und es wird ein neuer erstellt, wenn man zwei Einträge eben zusammenfügt. Das neue Wort hat dann wieder die gleiche Datenbankstruktur wie das "1stWord" oben zeigt.
So. Geht das irgendwie, dass man dann das neu-generierte Wort bewerten kann. Also eben Daumen hoch oder Daumen runter, dass es direkt unter dem Datenbankeintrag gespeichert wird, um danach eine Rankingliste zu erstellen?
Also das die Struktur dann so aussieht:{
"NewWord" : {
"NewWord" : {
"-LI125GLPy0-IPAm4GEM" : { (Am Besten ohne den Zeitstempel?)
"name" : "testlauf": {
"voteup" : 1,
"votedown" : 0
},
Für jeden Daumen hoch/runter wird der Eintrag eben um eins erhöht und nachher kann man dann die Rankingliste erstellen. Welches Wort eben die meisten Voteups hat, steht oben und so weiter.
Wie kann man Redundanzen vermeiden? Habe zwar schon einen Code dazu, aber irgendwie funktioniert das durch die Zeitstempel nicht so wirklich.
Code:
String txt1 = text1.getText().toString();
String txt2 = text2.getText().toString();
out.setText(txt1 + txt2);
final String outta = txt1 + txt2;
db3.child("Newword").orderByChild("Newword").equalTo(**was kommt hier rein? also wie greife ich dort auf die komplette Datenbank zu? **).addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
Toast.makeText(getApplicationContext(), "Word already exist", Toast.LENGTH_SHORT).show();
} else {
displayInputDialog(Type.Newword);
Intent intent = new Intent(MainActivity.this, GenWord.class);
intent.putExtra("message", outta);
startActivity(intent);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Der code sollte ja funktionieren?
Fast gleiche Frage wie die Nr. 2. Kann man einen Locationeintrag erstellen, in der man wie oben auch Daumen hoch/runter eintragen kann?
Also wenn jetzt einer aus Berlin eine Sache toll findet, dann soll es für den Locationeintrag "Berlin" eben ein "voteup" geben. Wenn ein anderer aus Berlin auch eine Sache toll findet, dann wird es um 1 erhöht und so weiter. Wenn jemand aus einem kleinen Dorf eine Sache schlecht findet gibts ein votedown. Ist das möglich, oder wäre das viel zu viel (da ja jede Location, also auch das letzte Dort der Welt in Frage kommen würde) für die Datenbank?
Ich hoffe, dass ich die Fragen verständlich rüber bringen konnte und das ihr ein paar Tipps habt.
Bin euch jetzt schon einmal sehr dankbar!
Noch einen schönen Tag.
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.