1. Nimm jetzt an unserem AGM - Gewinnspiel teil - Informationen zum M1, A2 und A8 findest Du hier, hier und hier!
  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

    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

    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

    Stimmt natürlich auch :)
    Hier im Forum siehts zumindest nicht sonderlich lesbar aus :p
     
  6. DieGoldeneMitte, 01.02.2012 #6
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    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

    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

    Weil Android keine JDBC Schnittstelle für die SQLite DB an Bord hat.