2016-07-11 18 views
1

Ich habe Spinner oder Listview mit Flaggen-Symbol und den Namen der Währung (I ihre R ids in SQLite zu speichern, zum Beispiel R.drawable.aed und R.string.aed aus ziehbar Ordner und string.xml)Richtiger Weg, um Zeichenketten und Drawbare Ressourcen in sqlite zu speichern?

Dann füge ich neue ziehbar, zum Beispiel

Meine Flaggen-Icons verschiebt cxx.png, ändert sich einige von ihnen mit anderen Bildern, nicht Flaggen-Icons. Dies passiert, wenn ich die App auf meinem Telefon aktualisiere. Wenn ich es installiere, oder lösche und installiere dann alles gut.

Ich habe verstanden, dass sqlite in meinem Programm speichern R IDs von Zeichnern nur einmal bei der Installation. Wenn ich Drawables oder Zeichenketten hinzufüge oder lösche, ändert R Iids Zahlen, aber in meiner sqlite Tabelle speicherte altes R ids.

kann ich versuchen Methode zu schreiben, das alle R ids in SQLite jedes Mal aktualisiert wird, wenn ich hinzufügen oder neue Saiten und Drawables löschen, durch DB_VERSION jedes Mal zu erhöhen. Gibt es eine einfachere Lösung?

Dies ist einer meiner Adapter:

public class SpinnerCursorAdapter extends CursorAdapter { 

public SpinnerCursorAdapter(Context context, Cursor cursor) { 
    super(context, cursor, 0); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    View view = LayoutInflater.from(context).inflate(R.layout.spinner_item, parent, false); 
    ViewHolder viewHolder = new ViewHolder(view); 
    view.setTag(viewHolder); 
    return view; 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    ViewHolder viewHolder = (ViewHolder) view.getTag(); 

    int flagIconId = Integer.valueOf(cursor.getString(5)); 
    viewHolder.flagIcon.setImageResource(flagIconId); 

    String currencyName = cursor.getString(4); 
    viewHolder.currencyName.setText(currencyName); 

    viewHolder.currencyCharCode.setText(cursor.getString(1)); 
} 

private static class ViewHolder { 
    final ImageView flagIcon; 
    final TextView currencyName; 
    final TextView currencyCharCode; 

    private ViewHolder(View view) { 
     flagIcon = (ImageView) view.findViewById(R.id.spinner_flag_icon); 
     currencyName = (TextView) view.findViewById(R.id.spinner_currency_name); 
     currencyCharCode = (TextView) view.findViewById(R.id.spinner_currency_char_code); 
    } 
} 

}

+0

Ja, Sie haben Recht, gehen Sie voran. – Amy

Antwort

0

I flexible Lösung finden für Streich- und Drawable Ressourcen zu sparen:
zum Beispiel I blabla.png haben und es ist Kennung R.drawable.blabla, dann speichere ich String blabla in sqlite.
In meinem Adapter Cursor nehme ich aktuelle Kennung blabla dies mit:
https://stackoverflow.com/a/4428288/318460
aber statt Drawable.class I R.drawable.class verwenden.

Gleiches mit String-Ressourcen.

Gewinn - es ermöglicht, Texte von Zeichenfolgen in string.xml ohne Aktualisierung sqlite Tabelle zu ändern.

0

Für String aus string.xml Verwendung zu speichern:

context.getResources().getString(R.string.value); 

und für Drawable ids Verwendung zu speichern:

String.valueOf(R.drawable.aed) 

So Ihre Frage wird sein:

insertCurrency(db, CharCode.AED, 0, 1, 1, 0, 3.672950, 3.672950, context.getResources().getString(R.string.aed),String.valueOf(R.drawable.aed), 0, 1, 1); 
+0

Ich werde diese Lösung versuchen. Was für ein Unterschied zwischen dem Speichern von String - String.valueOf (R.drawable.aed) und nur Integer - R.drawable.aed?Ich habe Angst, dass es das Problem nicht löst - wenn ich ein neues Bild im Zeichnungsordner einlege und meine App von Google Play aktualisiere, können sich einige Bilder in ListView verschieben (ListView wird von CursorAdapter von sqlite aufgeblasen) – Polurival

+0

Image Shifting ist ein [Recycling Problem von ListView] (http://stackoverflow.com/questions/6921462/listview-reusing-views-when-i-dont-want-it-to) es hat nichts mit Datenbank und Drawables zu tun und der Unterschied: Ich habe konvertiert die Int in ** String **, weil ich Ihre Anfrage sehe ** ich vermute, dass Sie String in die Datenbank eingeben, so meine Vermutung war der Spaltentyp der Spalte kann Text oder Varchar ** sein. Wenn es ** Int ** ist, kannst du es verlassen ** R.drawable.aed ** –

+0

Ich habe ViewHolder in Adaptern. – Polurival