Variable in "textfeld1.getText()"?

  • Antworten:8
Ludwig H.
  • Forum-Beiträge: 3.256

30.05.2011, 20:18:01 via Website

Hi,

ich habe bis jetzt (waren nur 5 Felder) mit folgenden Zeilen Eingaben eines EditTextes in die Datenbank geschrieben:
1myDB.execSQL("UPDATE "+MY_DB_TABLE+" SET provider = '" + provider1.getText().toString() + "' WHERE _id = 1;");
2myDB.execSQL("UPDATE "+MY_DB_TABLE+" SET provider = '" + provider2.getText().toString() + "' WHERE _id = 2;");
3myDB.execSQL("UPDATE "+MY_DB_TABLE+" SET provider = '" + provider3.getText().toString() + "' WHERE _id = 3;");
4...

Jetzt habe ich aber mehr Felder (will es später mit einem "+"-Button auf beliebig viele erweiterbar gestalten) und da wäre es ja Quatsch für jedes Feld eine solche Zeile zu schreiben. Deshalb will ich es mit einer while()-Schleifen machen:

1int i = 1;
2 String textfeld;
3 while ( i <= 15) {
4 textfeld = "provider"+i+".getText().toString()";
5 myDB.execSQL("UPDATE "+MY_DB_TABLE+" SET provider = '" +textfeld+ "' WHERE _id = "+i+";");
6 i++;
7 }
Nur weiß ich jetzt nicht, wie ich z.b. bei dem provider1.getText().toString() die 1 durch i ersetzen muss. "+provider+i+.getText().toString()" geht nicht. So wie es oben im Beispiel ist gehts aber auch nicht, da schreibt er dann provider1.getText().toString() in die Datenbank.

Gibts da einen Trick?
Und wenn ja, ginge das mit dem "EditText provider1 = (EditText) findViewById(R.id.provider1);" auch?

Danke schonmal

edit: Natürlich wäre sowas auch für z.b. "provider1.setText()" schön :)

— geändert am 30.05.2011, 20:25:55

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

30.05.2011, 21:55:36 via App

Verdammt. Wo bin ich denn gelandet? :D
Es wird grad nicht angezeigt in der App, wäre klasse, wenn dus mir ins Entwicklerforum verschieben könntest :)
:*)

Edit: ah, Testerforum. Dann ist es ja noch peinlicher :D
Kein Plan wie das hier ringekommen ist :)

— geändert am 30.05.2011, 21:57:02

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

30.05.2011, 22:26:30 via App

Sind das alle Datensätze? Oder nur ein Teil? Worauf ich hinaus will ist, könnte man nicht die WHERE-Klausel weglassen?
Lg Ansgar
edit: Falsch (oder gar nicht) gelesen :grin: Du könntest ein Array aus deinen EditTexts machen, und das durchlaufen.

— geändert am 30.05.2011, 22:28:29

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

31.05.2011, 18:32:21 via Website

Hm, gibt es denn keine andere / einfachere Möglichkeit? So eine while()-Schleife wäre schon super.
Arrays sind nämlich nicht so meine Freunde (aber psssst!) :D

Antworten
Markus B.
  • Forum-Beiträge: 636

31.05.2011, 19:17:37 via Website

Hi,
also ich folgendes gelesen habe:
1textfeld = "provider"+i+".getText().toString()";
bin ich fast vom Stuhl gefallen :) Was du vor hast ist mir schon klar und das dort nur providerX.getText().toString() in die DB geschrieben wird ist auch verständlich. Du baust dir dort halt einfach ein String zusammen und der Compiler behandelt das auch entsprechend. Zum Glück baut dieser dort keinen Methodenaufruf zusammen, da es übelst dreckiger Code wäre :)

Zum Thema Schleife:
Ich habe da mal ein bissel geschaut und eine Möglichkeit für dich gefunden.
1// Zentrale Ressource Datei
2 final Resources resources = getResources();
3 // Hier musst du das entsprechende Layout anpassen, welches du in der entsprechenden XML-Datei für die
4 // Activity angegeben hast.
5 final RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
6 // Iteration für alle Elemente, welche sich in dem Layout befinden
7 for(int i = 0;i<relativeLayout.getChildCount();i++)
8 {
9 // Aktuelles Element in der Iteration
10 final View view = relativeLayout.getChildAt(i);
11 // Testen ob es sich um ein EditText-Element handelt.
12 if(view instanceof EditText)
13 {
14 // Das entsprechende Element casten.
15 final EditText editText = (EditText) view;
16 // z.B. com.example:id/text
17 final String idVomEditText = resources.getResourceName(editText.getId());
18 // Hier kannst du dann alternativ dein Statment absetzten, nachdem du den Wert der Variable
19 // "idVomEditText" entsprechende verarbeitet hast.
20 Toast.makeText(this, "EditText gefunden " + idVomEditText, Toast.LENGTH_SHORT).show();
21 }
22 }
Ob du nun wirklich sowas machen willst bleibt dir überlassen :)

Nun noch eine Sache zu deinen Update-Statments. Diese sind nicht sql-Injection sicher. Jetzt kann man sich natürlich die Frage stellen, ob dieses in diesem Fall notwendig ist. Ich denke aber schon :)
Soll also heißen entweder du escape(st) die Strings aus den EditTexten selbst oder du nutzt einfach PreparedStatments.

Gruß,
Markus

— geändert am 31.05.2011, 19:18:39

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

31.05.2011, 19:30:14 via Website

Ja, dass der Compiler einen String statt Code zusammenbaut ist mir auch klar, deswegen geht es ja nicht :D

Werde mir den Code mal genauer anschauen, Dankeschön!

Und wegen der SQL Injection: Nachdem ich mir die Beschreibung des Begriffs auf Wikipedia durchgelesen hab, habe ich entschieden, dass es in dieser App wirklich egal ist. :D
Aber natürlich ist das ein wichtiges Thema für "größere" Apps und ich werde mich damit befassen.
Dankeschön! ;)

P.S: Diese App ist eh "zur Übung", dass ich mich mal mit SQL und komplexeren Sachen wie eben Schleifen und so auseinander setze. :)

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

01.06.2011, 09:23:28 via Website

luhu
Und wegen der SQL Injection: Nachdem ich mir die Beschreibung des Begriffs auf Wikipedia durchgelesen hab, habe ich entschieden, dass es in dieser App wirklich egal ist. :D
Es geht ja nicht nur darum.
Befehle dynamisch zusammenzubauen ist EXTREM fehleranfällig. Das sind dann aber auch Fehler, die erst zur Laufzeit auffallen und vor allem meistens erst beim User, wo du nicht mehr debuggen kannst.
Man ist ja grade bei Hochsprachen immer bemüht syntaktische Fehler möglichst zum Kompilierzeitpunkt zu finden und nicht erst zur Laufzeit.
Aus diesem Grund werden ja auch immer mehr Annotations eingeführt, die genau das zum Ziel haben. (@Override, @NotNull, ... )

Was Du da gerne hättest wäre etwas wie eval() in JavaScript. Sowas kann zwar Vorteile bringen, aber bei einer Sprache, die wie Java auch eine starke Business-Orientierung hat ist Robustheit des Codes IMHO deutlich wichtiger.

Antworten