Autore Topic: Errore query di SELECT  (Letto 591 volte)

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Errore query di SELECT
« il: 07 Novembre 2014, 11:41:17 CET »
0
non riesco a capire perche la query di SELECT mi da il seguente errore nel logcat
Codice (Java): [Seleziona]
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gaetano.prova/com.gaetano.prova.uno}: android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
            at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
            at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
            at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
            at com.gaetano.prova.DbAdapter.getdato(DbAdapter.java:39)
            at com.gaetano.prova.uno.onCreate(uno.java:22)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
le query che mi restituiscono l' errore e che ho inserito nella classe DbAdapter sono le seguenti
Codice (Java): [Seleziona]
 public Cursor getdato() {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor crs = db.rawQuery("SELECT prezzo FROM tab LIMIT 1 OFFSET 0",null);
        while (crs.moveToNext());
        String prezzo = crs.getString(1);
        return crs;
    }

    public Cursor getdati() {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor crs = db.rawQuery("SELECT prezzo,mesi FROM tab",null);
        if(crs.moveToFirst()){
            do {
                String prezzo = crs.getString(1);
                String mesi = crs.getString(2);
            }while (crs.moveToNext());
        }
        return crs;
    }
vi posto il database nella classe DbHelper
Codice (Java): [Seleziona]
public class DbHelper extends SQLiteOpenHelper {
    //costruttore
    public DbHelper(Context context) {super(context, "DATABASE", null, 3);}

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        String query = "CREATE TABLE tab" +
                "(" +
                "_id integer primary key autoincrement," +
                "prezzo text not null," +
                "mesi text not null," +
                "sup text not null" +
                ")";
//Eseguiamo la query
    db.execSQL(query);
    inizializza(db);
}
    private void inizializza(SQLiteDatabase db) {
        ContentValues values = new ContentValues();
        values.put("prezzo", "165000");
        values.put("mesi", "22");
        values.put("sup", "57,47");
        db.insert("tab", null, values);

        values = new ContentValues();
        values.put("prezzo", "345000");
        values.put("mesi", "16");
        values.put("sup", "110");
        db.insert("tab", null, values);

        values = new ContentValues();
        values.put("prezzo", "280000");
        values.put("mesi", "14");
        values.put("sup", "118");
        db.insert("tab", null, values);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        db.execSQL("DROP TABLE IF EXISTS tab");
        onCreate(db);
    }
}
infine vi posto la classe activity che dovrebbe rappresentare i dati di un layout di tre semplici  EditText
Codice (Java): [Seleziona]
public class uno extends Activity {

    private DbAdapter db = new DbAdapter(this);
    private CursorAdapter adapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.uno);

        adapter = new CursorAdapter(this, db.getdato(), false) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent) {
                return null;
            }

            @Override
            public void bindView(View view, Context context, Cursor cursor) {

                EditText etxt = (EditText) view.findViewById(R.id.txt_PRZ1);
                etxt.setText(cursor.getString(cursor.getColumnIndex("prezzo")));
                etxt = (EditText) view.findViewById(R.id.txt_DAT1);
                etxt.setText(cursor.getString(cursor.getColumnIndex("mesi")));
                etxt = (EditText) view.findViewById(R.id.txt_SUP1);
                etxt.setText(cursor.getString(cursor.getColumnIndex("sup")));
            }

            @Override
            public Object getItem(int position) {
                Cursor crs = getCursor();
                crs.moveToPosition(position);

                String prezzo = crs.getString(crs.getColumnIndex("prezzo"));
                String mesi = crs.getString(crs.getColumnIndex("mesi"));
                String sup = crs.getString(crs.getColumnIndex("sup"));
                return crs;
            }
        };
    }
}
aggiungo che il database interrogato con una query del tipo
Codice (Java): [Seleziona]
public Cursor gettab() {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor crs = db.query("tab", null, null, null, null, null, null);
        return crs;
mi restituisce correttamente, in una listview,  tutti i dati contenuti nel database.
grazie a chi vorrà aiutarmi
« Ultima modifica: 07 Novembre 2014, 11:46:48 CET da gaetano_c »

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Errore query di SELECT
« Risposta #1 il: 07 Novembre 2014, 11:46:24 CET »
0
L'errore penso sia qui:

Codice (Java): [Seleziona]
String prezzo = crs.getString(1);
dovresti fare:

Codice (Java): [Seleziona]
crs.getString(0)
Però forse mi sto sbagliando, facci sapere.
I numeri contano molto di più del seme.

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Errore query di SELECT
« Risposta #2 il: 07 Novembre 2014, 12:01:05 CET »
0
grazie per la risposta ma purtroppo dà lo stesso errore,
il problema però è sicuramente sulla riga che hai indicato tu in quanto se digito l'indicazione azzurra del logcat il cursore del mouse si
posiziona proprio su quella riga.
grazie ancora
 

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Errore query di SELECT
« Risposta #3 il: 07 Novembre 2014, 12:19:07 CET »
0
scusa ma perchè mai fai:
Codice (Java): [Seleziona]
public Cursor getdato() {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor crs = db.rawQuery("SELECT prezzo FROM tab LIMIT 1 OFFSET 0",null);
        while (crs.moveToNext());
        String prezzo = crs.getString(1);
        return crs;
    }

tu fai una query che è LIMIT 1 è poi ci metti un while sul cursore?
vai a fare un while moveToNext prima di iniziare a leggere senza verificare quanti dati ha (cursor.getCount()), senza verificare se sei al primo elemento (isFirst ) o se sei prima del primo (isBeforeFirst),
poi vai a prendere per ogni riga (vista la query 1 sola) la colonna 1 (che la tua query richiede solo 1 colonna quindi dovresti usare 0), la metti in una variabile che poi sovrascrivi ogni volta e non usi... a cosa serve?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Errore query di SELECT
« Risposta #4 il: 07 Novembre 2014, 15:24:44 CET »
0
non so se va bene, ho provato così ma continua a dare errore:

Codice (Java): [Seleziona]
public Cursor getdato() {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor crs = db.rawQuery("SELECT * FROM tab WHERE prezzo LIMIT 1 OFFSET 1",null);
        String s = crs.getString(1);
        return crs;
    }

l'errore
Codice (Java): [Seleziona]
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Errore query di SELECT
« Risposta #5 il: 07 Novembre 2014, 16:14:38 CET »
0
LIMIT 1 offset 0 andava bene
NON serve prendere fuori la stringa dal cursor se non la usi.
richiama almeno un crs.moveToFirst prima di operare sul cursore...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Errore query di SELECT
« Risposta #6 il: 07 Novembre 2014, 16:18:23 CET »
0
gaetano_c, non me ne volere, ma temo tu non abbia ben chiaro come funzionano i database e le query per estrarre i dati. Non è una critica, ma solo una constatazione per evitare di dare per scontati alcuni concetti che poi non conosci.

Un po' di osservaziono sparse:
- la clausola LIMIT 1 serve ad ottenere un solo risultato dalla query
- la clausola OFFSET 1 serve per far uscire i risultati della query a partire da un certo offset, tipico delle query con paginazione dei risultati
- la clausola WHERE prende per argomento una espressione booleana e indica la condizione da soddisfare per mettere la riga della tabella nei risultati. "WHERE prezzo" avrebbe senso se prezzo fosse booleano, ma credo sia un TEXT.
- una rawquery sicura, per vedere se il tuo codice funziona, potrebbe essere db.rawQuery("SELECT * FROM tab",null);
- i risultati di questa query, uno o più, sono accessibili con l'oggetto cursor, pensalo come un vettore che contiene tutti i risultati della query.
- con moveToNext() ti posizioni sul prossimo elemento (sul primo se non lo avevi mai usato, per cui usalo almeno una volta).
- quando ci si aspettano più risultati si usa un while perchè così si scorrono tutti e nel codice eseguito ad ogni iterazione metterai ad esempio getString(1), per prelevare il contenuto della colonna di indice 1 come stringa.
- Ma il codice per il prelievo dati deve stare nel corpo del while, perchè puoi eseguirlo SOLO se il moveToNext() ha avuto successo.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Errore query di SELECT
« Risposta #7 il: 07 Novembre 2014, 17:21:26 CET »
0
Bradipao tranquillo, non potrei  mai prendermela perche ho consapevolezza dei miei limiti pertanto ti ringrazio per il tempo che hai speso, di fatto però non riesco a leggere un singolo dato della tabella

Inviato dal mio GT-I9300


Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Errore query di SELECT
« Risposta #8 il: 07 Novembre 2014, 17:45:38 CET »
0
Nicola_D ho fatto come dicevi ovvero ho richiamato move.ToFirst prima di operare sul cursore e mi visualizza correttamente il layout ma senza il dato richiesto con la query
Grazie per l'intuizione
Ho fatto un passo avanti

Inviato dal mio GT-I9300


Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Errore query di SELECT
« Risposta #9 il: 13 Novembre 2014, 11:27:12 CET »
0
problema risolto in questo modo
Codice (Java): [Seleziona]
public Cursor getdato() {
        SQLiteDatabase db = helper.getReadableDatabase();
        String sql = "SELECT _id,prezzo FROM tab LIMIT 1 OFFSET 0";
        Cursor crs = db.rawQuery(sql, null);
        return crs;
    }
siccome il cursore punta in una tabella provvisoria dove legge come prima colonna quella autogenerata in auto incremento andava semplicemente e banalmente anteposto alla colonna prezzo il nome della colonna _id

pertanto, a chi dovesse servire,  con questa query si estrae un elemento della colonna prezzo di un solo record partendo dal primo
E naturalmente nessun ciclo

« Ultima modifica: 13 Novembre 2014, 12:14:59 CET da gaetano_c »