R.drawable. VS. SQLite

  • Hallo zusammen,


    leider habe ich ein kleines Problem!
    Eine funktionierende Lösung hab ich bereits, doch glaube ich das es eine viel elegantere Lösung geben muss.


    Mein Szenario


    Eine SQL Datenbank mit einem INTEGER COLUMN
    Eine Recyclerview


    Wenn ich in der Datenbank nur Zahlen ablegen, z.B. 0-200 und diese dann im RecyclerView.Adapter in der onBindViewHolder eine if Anweisung wie folgende schreibe:


    if(currentItem.getmExampleImage() == 0){
    holder.imageView.setImageResourse(R.drawable.example_image_0);
    } else if (currentItem.getmExampleImage() == 1){
    holder.imageView.setImageResourse(R.drawable.example_image_1);
    } usw.,


    werden die Bilder geladen. Doch sollte ich wirklich 200 und mehr Bilder benutzen, ist das echt mühsam und geht bestimmt auf die Performance und den Akku.


    Bisher sind Alternativen bei mir fehlgeschlagen.
    Hat jemand eine Idee oder einen Tipp?


    Danke und netten Abend

  • Kannst du anstatt dem int den Bildnamen(string) speichern?
    Dann könntest du es so machen:

    Java
    String name = "your_drawable";
    int id = getResources().getIdentifier(name, "drawable", getPackageName());
    Drawable drawable = getResources().getDrawable(id);

    Beim Int wirst du wohl mappen müssen und dein if/else nutzen müssen.

  • @domjos Danke. Es sind .png Dateien, jedes einzelne ca. 60kb groß. Vielleicht werde ich die Qualität der Bilder etwas verbessern, denke aber das ich auf jeden Fall unter 200kb je .png bleiben werde. Bei den Bildern handelt es sich nur um ein Produkt Bild, welches zusammen mit den dazugehörigen Informationen als ein Item in der Recyclerview angezeigt werden soll.


    @Xcreen danke, hatte bisher den Sinn deines Beispiel nicht verstanden. Englisch ist nicht so ganz meine Stärke, denke das ich durch deine Erklärung bestimmt weiter komme. Falls nicht Mappe ich einfach und versuche durch eine neue externe Klasse die von ViewHolderAdapter erbt meine if/else Anweisung sauber und übersichtlich voneinander zu trennen.

  • Nunja du speicherst ja aktuell Interger in deiner Datenbank. Du könntest (wenn möglich) statt die Integer auch die Bildnamen (z.B. example_image_0) speichern.
    Dann kannst du beim auslesen dadurch das passende Drawable bestimmt (mit dem Code, den ich dir gezeigt habe).


    Falls das nicht geht, muss du wohl dabei bleiben, wie du es jetzt machst.
    Dann würde ich aber ein Switch/Case verwenden anstatt die ganzen Else/If.

  • Das ganze Bild in die Datenbank zu packen hat viele Nachteile.
    Die größten Nachteile:
    1. Performance
    2. Backups und Imports werden deutlich größer, was je nach Anwendung dann echt Probleme bereiten kann


    Deswegen packt man in einer Datenbank immer nur Referenzen rein. In seinem Fall würde halt der Drawable-Name sinnmachen, da er so direkt das richtige Bild anzeigen könnte.

  • @Xcreen danke es hat funktioniert.


    Für meine Zwecke habe ich lediglich


    Code
    String name = "image";
    int id = getResources().getIdentifier(name, "drawable", getPackageName());


    ausgeführt und die id als Integer in die Datenbank geschriebenen. Mittels des RecyclerView.Adapter(s) kann ich die Image im AVD dann mit


    Code
    holder.imageView.setImageResource(currentItem.getImage());

    ohne Probleme laden. Nochmals danke.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!