1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Datenbankabfrage. Bin verzweifelt

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von zblack, 30.01.2012.

  1. zblack, 30.01.2012 #1
    zblack

    zblack Threadstarter Gast

    Ich habe eine Frage:
    ich habe in meiner Datenbank folgende Spalten : name und ort.
    Den Namen wähle ich in einem Fenster und übergebe den an die weitere Activity. Das gleiche mache ich mit dem ort auch.
    name und ort kriege ich mit den Aufrufen:
    Code:
     name = getIntent().getExtras().getString("name");
     ort  = getIntent().getExtras().getString("ort");
    
    Jetzt möchte ich mit name und ort ein plz aus der Datenbank rauskriegen
    Dafür habe ich in der Klasse, wo name und ort ermittelt wurden folgendes geschrieben:
    Code:
    dataBaseHelper = new DataBaseHelper(this);
    dataBaseHelper.openDataBase();
    dataBaseHelper.getPLZ(name, ort);
    dataBaseHelper.close();
    
    in der Database Klasse habe ich die Funktion :
    Code:
    public String getPLZ(String name, String ort){
            // TODO Auto-generated method stub
            String suche = "NAME = " + "'" + name + "'" + " AND ORT = " + "'" + ort + "'";
            Cursor c = myDatabase.query(USER_TABLE, columns,suche, null, null, null, null);
            if (c != null){
                c.moveToFirst();
                String plz = c.getString(c.getColumnIndex(PLZ));
                c.close();
    
                return plz;
            }
            return null;
        }
    
    geschrieben. Doch statt den PLZ kriege ich immer wieder :
    Code:
    01-30 21:00:02.845: I/Zygote(1577): Zygote: pid 1577 has INTERNET permission, then set capability for CAP_NET_RAW(13)
    01-30 21:00:03.315: I/ActivityThread(1577): queueIdle
    01-30 21:00:03.315: V/ActivityThread(1577): Reporting idle of ActivityRecord{4a405698 token=android.os.BinderProxy@4a4050d0 {de.meinautohaus/de.meinautohaus.AppStartSeteActivity}} finished=false
    01-30 21:00:03.315: W/ActivityNative(1577): send ACTIVITY_IDLE_TRANSACTION
    01-30 21:05:41.285: I/ActivityThread(1577): queueIdle
    01-30 21:05:41.285: V/ActivityThread(1577): Reporting idle of ActivityRecord{4a405698 token=android.os.BinderProxy@4a4050d0 {de.meinautohaus/de.meinautohaus.AppStartSeteActivity}} finished=false
    01-30 21:05:41.285: W/ActivityNative(1577): send ACTIVITY_IDLE_TRANSACTION
    01-30 21:06:17.955: I/ActivityThread(1577): queueIdle
    01-30 21:06:17.955: V/ActivityThread(1577): Reporting idle of ActivityRecord{4a405698 token=android.os.BinderProxy@4a4050d0 {de.meinautohaus/de.meinautohaus.AppStartSeteActivity}} finished=false
    01-30 21:06:17.955: W/ActivityNative(1577): send ACTIVITY_IDLE_TRANSACTION
    01-30 21:06:47.245: I/ActivityThread(1716): queueIdle
    01-30 21:06:47.245: V/ActivityThread(1716): Reporting idle of ActivityRecord{4a405660 token=android.os.BinderProxy@4a4050d0 {de.meinautohaus/de.meinautohaus.AppStartSeteActivity}} finished=false
    01-30 21:06:47.245: W/ActivityNative(1716): send ACTIVITY_IDLE_TRANSACTION
    01-30 21:06:48.845: I/ActivityThread(1716): queueIdle
    01-30 21:06:48.845: V/ActivityThread(1716): Reporting idle of ActivityRecord{4a416260 token=android.os.BinderProxy@4a415cd8 {de.meinautohaus/de.meinautohaus.StartLogosActivity}} finished=false
    01-30 21:06:48.845: W/ActivityNative(1716): send ACTIVITY_IDLE_TRANSACTION
    01-30 21:06:49.515: E/Database(1716): sqlite3_open_v2("/data/data/de.meinautohaus/databases/autohausDB.db", &handle, 1, NULL) failed
    01-30 21:06:49.675: I/ActivityThread(1716): queueIdle
    01-30 21:06:49.685: V/ActivityThread(1716): Reporting idle of ActivityRecord{4a41d8e0 token=android.os.BinderProxy@4a41d350 {de.meinautohaus/de.meinautohaus.StandortWahlActivity}} finished=false
    01-30 21:06:49.685: W/ActivityNative(1716): send ACTIVITY_IDLE_TRANSACTION
    01-30 21:06:50.585: W/dalvikvm(1716): threadid=1: thread exiting with uncaught exception (group=0x400207d8)
    01-30 21:06:50.595: E/AndroidRuntime(1716): FATAL EXCEPTION: main
    01-30 21:06:50.595: E/AndroidRuntime(1716): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.meinautohaus/de.meinautohaus.MeinAutohausStartActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.app.ActivityThread.access$2300(ActivityThread.java:126)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.os.Handler.dispatchMessage(Handler.java:99)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.os.Looper.loop(Looper.java:123)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.app.ActivityThread.main(ActivityThread.java:4633)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at java.lang.reflect.Method.invoke(Method.java:521)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at dalvik.system.NativeStart.main(Native Method)
    01-30 21:06:50.595: E/AndroidRuntime(1716): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at de.meinautohaus.DataBaseHelper.getPLZ(DataBaseHelper.java:253)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at de.meinautohaus.MeinAutohausStartActivity.onCreate(MeinAutohausStartActivity.java:76)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
    01-30 21:06:50.595: E/AndroidRuntime(1716):     ... 11 more
    
    der Fehler kommt aber nicht wenn ich den suche String z.b so schreibe :
    String suche = "NAME = 'ich' AND ORT = 'Berlin'";
     
  2. kleinerkathe, 31.01.2012 #2
    kleinerkathe

    kleinerkathe Android-Lexikon

    Beiträge:
    1,365
    Erhaltene Danke:
    219
    Registriert seit:
    23.01.2010
    Dann lass dir "suche" doch einfach mal ausgeben und schau worin er sich vom problemlosen String unterscheidet ...

    btw. warum nicht etwas kürzer? :
     
  3. zblack, 31.01.2012 #3
    zblack

    zblack Threadstarter Gast

    stimmt, warum einfach wenns verdammt kompliziert geht ? :D
    habe ich gelöst. Lag an der schreibweise. danke
     
  4. Tom299, 31.01.2012 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Manchmal ist es übersichtlicher, wenn man mehr Code schreibt. In diesem Fall ist das SQL kurz, aber bei größeren SQL-Strings kann die Fehlersuche viel einfacher sein, wenn man nicht alles zusammenhängt. Wie schnell hat man da das ' gefolgt vom " überlesen -> '" bzw. vergessen hinzuschreiben. Aber wenn man ein + "'" + vergißt sieht man das schnell ;-)
     
    kleinerkathe bedankt sich.
  5. kleinerkathe, 31.01.2012 #5
    kleinerkathe

    kleinerkathe Android-Lexikon

    Beiträge:
    1,365
    Erhaltene Danke:
    219
    Registriert seit:
    23.01.2010
    Stimmt natürlich auch :)
    Hier im Forum siehts zumindest nicht sonderlich lesbar aus :p
     
  6. DieGoldeneMitte, 01.02.2012 #6
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Mal so am Rande:

    Ich bin kein Freund davon, sql querys so zusammenzubauen, das gibt "herrliche" Abstütze, wenn man zum Beispiel nach Hochkommas sucht. Siehe auch SQL-Injection

    Allerdings ist die Android Lösung SQLiteQueryBuilder.appenWhereEscapeString auch nicht gerade lesbar. :-/
     
    Tom299 bedankt sich.
  7. jan.b, 02.02.2012 #7
    jan.b

    jan.b Android-Hilfe.de Mitglied

    Beiträge:
    105
    Erhaltene Danke:
    22
    Registriert seit:
    07.06.2011
    Wieso nutzt du denn keine Prepared Statements? Damit würde sich die Sache mit Hochkomma und Injection erledigen.
     
  8. DieGoldeneMitte, 02.02.2012 #8
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Weil Android keine JDBC Schnittstelle für die SQLite DB an Bord hat.
     

Diese Seite empfehlen