FC atunci când caută înregistrare în SQLite

Am mai multe metode pentru a obține o înregistrare în aplicația mea Dar dintr-un motiv oarecare, asta îmi continuă să-mi dea FC! Folosesc următoarea metodă pentru a obține Cursorul:

Cursor c=helper.getRecordById(num);

Care este implementat după cum urmează:

public Cursor getRecordById(int rowId) {
    String rowIDs=""+rowId;
    String SelectById = "SELECT id, OrderName, OrderLink, DateYear, DateMonth, DateDay, OrderPrice FROM Orders WHERE id=?";
    String[] args={rowIDs};
    return(getReadableDatabase().rawQuery(SelectById, args));
}

Am încercat, de asemenea, fără a converti int la String, dar am lăsat-o în acest fel .. obține aceeași eroare în ambele sensuri.

Ori de câte ori ajung la următoarea linie:

String name=c.getString(c.getColumnIndexOrThrow("OrderName"));

Îl iau pe FC. GetColumnIndex funcționează foarte bine ... l-am testat exclusiv. Dar getString aruncă eroarea. :

06-02 21:07:13.656: W/KeyCharacterMap(4329): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
06-02 21:07:16.006: D/AndroidRuntime(4329): Shutting down VM
06-02 21:07:16.006: W/dalvikvm(4329): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-02 21:07:16.026: E/AndroidRuntime(4329): FATAL EXCEPTION: main
06-02 21:07:16.026: E/AndroidRuntime(4329): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Sagi.MyOrders/com.Sagi.MyOrders.DisplayRecord}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.os.Looper.loop(Looper.java:123)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at java.lang.reflect.Method.invokeNative(Native Method)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at java.lang.reflect.Method.invoke(Method.java:521)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at dalvik.system.NativeStart.main(Native Method)
06-02 21:07:16.026: E/AndroidRuntime(4329): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at com.Sagi.MyOrders.DisplayRecord.onCreate(DisplayRecord.java:48)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-02 21:07:16.026: E/AndroidRuntime(4329):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
06-02 21:07:16.026: E/AndroidRuntime(4329):     ... 11 more
06-02 21:12:16.126: I/Process(4329): Sending signal. PID: 4329 SIG: 9

Lucrul amuzant este că am copiat aceeași metodă de căutare exactă pe care am folosit-o într-un alt loc care funcționează foarte bine! Am încercat chiar să-i dau o constantă pentru a căuta pentru care știu că există doar pentru a verifica. dar nimic. eroare din nou și din nou!

Vă mulțumim!

0
getColumnIndex() este sensibil la minuscule: stackoverflow.com/questions/9029668/…
adăugat autor Yaqub Ahmad, sursa

1 răspunsuri

Un Cursor indică inițial o înregistrare înainte de pornire, pentru a permite acest tip de cod:

final Cursor cursor = /* get cursor */;
while(cursor.moveToNext()) {
    /* do something with cursor */
}

Dacă așteptați doar o înregistrare și sunteți sigur că va fi o înregistrare, înainte de a accesa codul Cursor , faceți următoarele:

cursor.moveToNext();

sau:

cursor.moveToFirst();
0
adăugat
Acum primesc: 06-02 21: 40: 15.457: E/AndroidRuntime (4678): java.lang.RuntimeException: Imposibil de activat ComponentInfo {com.Sagi.MyOrders/com.Sagi.MyOrders.DisplayRec & zwnj; ord }: android.database.CursorIndexOutOfBoundsException: Indexul 0 solicitat, cu o dimensiune de 0
adăugat autor SagiLow, sursa
Mi-am dat seama că nu a fost o revenire NULL, dar varianta pe care am încercat să o pun în String a fost neinitializată.
adăugat autor SagiLow, sursa
@SagiLow: Eroarea este destul de clară, încercați să accesați primul element al unui set gol. Cursorul dvs. nu are rezultate și nu ați verificat dacă moveTo ...() a returnat true .
adăugat autor K-ballo, sursa
@SagiLow: Cât de nepoliticos este să nu răspundeți la răspunsul meu doar pentru că ați făcut încă o eroare în codul dvs. ...
adăugat autor K-ballo, sursa
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md