Autore Topic: Cursori e liste  (Letto 1114 volte)

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Cursori e liste
« il: 12 Settembre 2011, 17:06:35 CEST »
0
Salve ragazzi,
scusate se faccio una domanda magari ritrita ma sono nuovo della piattaforma e non so cosa cercare.

Per farla in breve,
ho una ListActivity che visualizza un Arraylist.
All' onListItemClick() richiamo un'altra ListActivity che dovrebbe a sua volta visualizzare un'altra lista.
Per ottenere le liste sfrutto una classe che estende SQLiteOpenHelper() per costruire il db e fare le query.

nello specifico la prima ListActivity esegue questo codice

Codice (Java): [Seleziona]
protected void onListItemClick(ListView l, View v, int position, long id) {
                String selection = l.getItemAtPosition(position).toString();
                WhatelsecomicsListActivity comicsList= new WhatelsecomicsListActivity();
                comicsList.showComicsList(selection);
                //Toast.makeText(this, selection, Toast.LENGTH_LONG).show();
        }


il metodo showComicsList() della seconda ListActivity invece esegue questo codice

Codice (Java): [Seleziona]
public void showComicsList(String series_name)
        {
                wecDatabasesManager databaseHelper = new wecDatabasesManager(this);
                Cursor series = databaseHelper.getSeriesIdByName(series_name);
                Cursor cursor = databaseHelper.getComics(series.getString(0));
               
                for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
                        //fetching from database and adding to arrayList
                        results.add(cursor.getString(cursor.getColumnIndex(wecComicsTable.NUMBER)));
                }

                cursor.close();

                //display in screen
                this.setListAdapter(
                                new ArrayAdapter<Object>(
                                                WhatelsecomicsListActivity.this,
                                                android.R.layout.simple_list_item_1,
                                                results
                                )
                );
        }


Il metodo getSeriesIdByName() richiama un cursore presente nella classe che gestisce il db e di preciso
Codice (Java): [Seleziona]
public Cursor getSeriesIdByName(String series_name)
        {
                return( getReadableDatabase().query(
                                wecSeriesTable.TABLE_NAME,
                                null,
                                "name =" + series_name,
                                null,
                                null,
                                null,
                                null,
                                null));
        }

Quando clicco su un elemento della prima lista io ,mi aspettrei di trovare a monitor un'altra lista con i figli dell'elemento selezionato, invece ho questo errore
Codice: [Seleziona]
09-12 14:12:17.906: ERROR/AndroidRuntime(6090): FATAL EXCEPTION: main
09-12 14:12:17.906: ERROR/AndroidRuntime(6090): java.lang.NullPointerException
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at zepod.whatelsecomics.databases.wecDatabasesManager.getComics(wecDatabasesManager.java:159)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at zepod.whatelsecomics.WhatelsecomicsListActivity.showComicsList(WhatelsecomicsListActivity.java:25)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at zepod.whatelsecomics.WhatelsecomicsActivity.onListItemClick(WhatelsecomicsActivity.java:47)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.app.ListActivity$2.onItemClick(ListActivity.java:319)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.widget.ListView.performItemClick(ListView.java:3513)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1800)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.os.Handler.handleCallback(Handler.java:587)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.os.Looper.loop(Looper.java:123)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at android.app.ActivityThread.main(ActivityThread.java:3647)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at java.lang.reflect.Method.invokeNative(Native Method)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at java.lang.reflect.Method.invoke(Method.java:507)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-12 14:12:17.906: ERROR/AndroidRuntime(6090):     at dalvik.system.NativeStart.main(Native Method)

Scusate se non sono stato abbastanza chiaro nell'esposizione del problema.
Se qualcuno mi potesse aiutare mi sbloccherebbe da una brutta situazione ;-)

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Cursori e liste
« Risposta #1 il: 13 Settembre 2011, 09:25:32 CEST »
0
Hai provato a vedere il contenuto di selection ?
Sai già quale riga va in crash?
Se non lo sai prova a commentare ogni singola riga per vedere quale fa esplodere l'app
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Re:Cursori e liste
« Risposta #2 il: 13 Settembre 2011, 09:33:45 CEST »
0
Cuaio, grazie per l'aiuto.

selection è correttamente valorizzato, infatti se metto un Log sia prima di selection che prima della query mi viene stampato.
Non appena però viene eseguita la query si spacca tutto.

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Cursori e liste
« Risposta #3 il: 13 Settembre 2011, 09:51:40 CEST »
0
Ma sei riuscito a capire quale è la riga che ti esplode ?
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Re:Cursori e liste
« Risposta #4 il: 13 Settembre 2011, 09:58:18 CEST »
0
il problema è quanto chiamo i 2 cursori
Cursor series = databaseHelper.getSeriesIdByName(series_name);
Cursor cursor = databaseHelper.getComics(series.getString(0));

Al primo metodo (series) arriva un valore corretto ma la query che esegue va in errore.

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Cursori e liste
« Risposta #5 il: 13 Settembre 2011, 10:20:53 CEST »
0
Nel terzo parametro hai messo null, come mai ?Non dovresti specificare le colonne da visualizzare ?
Comunque dai un occhio a questo link(è un pdf) leggi dalla pagina 22 alla 23.
ecco il link http://www.google.it/url?sa=t&source=web&cd=16&ved=0CFEQFjAFOAo&url=http%3A%2F%2Fwww.mobilewd.it%2F-hcDownloadAllegato%2Fid%2F140%2Fdispensa.html&ei=OhFvTtGvOczQ4QTE8IiFCQ&usg=AFQjCNGx2K5hNDDfU2EwWp4hlnJ9Ful0SQ&sig2=yWKWdUA03XQlrvQZ3e3F3w
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Re:Cursori e liste
« Risposta #6 il: 13 Settembre 2011, 10:32:17 CEST »
0
grazie, leggo subito ;-)

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Re:Cursori e liste
« Risposta #7 il: 13 Settembre 2011, 10:52:24 CEST »
0
ho seguito il pdf che mi hai girato ma non funziona.
o meglio, è quello che faccio per ottenere la lista della prima ListActivity, ma quando faccio la stessa cosa per la seconda mi va in errore...

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Cursori e liste
« Risposta #8 il: 13 Settembre 2011, 10:54:06 CEST »
0
OK, abbiamo fatto un passo avanti ? la prima funziona ?
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Re:Cursori e liste
« Risposta #9 il: 13 Settembre 2011, 11:00:24 CEST »
0
Nella prima ListActivity chiamo il metodo
Codice: [Seleziona]
Cursor cursor = databaseHelper.getSeries();che funziona correttamente e fa quello che riporti tu nella guida.
Questo mi da la possibilità di visualizzare a monitor una prima lista.
Quando clicco su un elemento della lista eseguo il metodo onListItemClick() che richiama la seconda ListActivity che dovrebbe a sua volta chiamare altri 2 curosi per ottenere i figli dell'elemto cliccato in base all'id del primo (chiave esterna sul db)
Codice: [Seleziona]
wecDatabasesManager databaseHelper = new wecDatabasesManager(this);
Log.d("wec", series_name);
Cursor series = databaseHelper.getSeriesIdByName(series_name);
Log.d("wec", series.getLong(0) + " " + series.getString(1));
Cursor cursor = databaseHelper.getComics(series.getLong(0));

Il primo log viene visualizzato mentre il secondo no :-(

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:Cursori e liste
« Risposta #10 il: 13 Settembre 2011, 11:07:34 CEST »
0
perchè dopo che hai chiamato il primo cursore devi fare cursor.moveToFirst().
se fai subito getString(0) lui cerca di prendere una stringa alla colonna zero ma nella riga -1!
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 Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Cursori e liste
« Risposta #11 il: 13 Settembre 2011, 11:13:27 CEST »
0
Posta anche il codice del metodo getComics
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Re:Cursori e liste
« Risposta #12 il: 13 Settembre 2011, 12:21:44 CEST »
0
ho risolto parte del problema,
per prima cosa ho buttato la seconda ListActivity eed ho aggiunto la chiamata al cursore direttamente nel metodo onListItemClick presente nella prima lista.
Codice: [Seleziona]
protected void onListItemClick(ListView l, View v, int position, long id) {
                String selection = l.getItemAtPosition(position).toString();
                wecDatabasesManager databaseHelper = new wecDatabasesManager(this);
                Cursor series = databaseHelper.getSeriesIdByName(selection);
                while (series.moveToNext())
                {
                        Cursor comics = databaseHelper.getComics(series.getLong(0));
               
                        for (comics.moveToFirst(); !comics.isAfterLast(); comics.moveToNext()) {
                           //fetching from database and adding to arrayList
                           comicsList.add(comics.getString(comics.getColumnIndex(wecComicsTable.NUMBER)));
                       }
                }
               
                //display in screen
                this.setListAdapter(
                                new ArrayAdapter<Object>(
                                                WhatelsecomicsActivity.this,
                                                android.R.layout.simple_list_item_1,
                                                comicsList
                                )
                );
        }

Questo risolve gli errori.
L'unico problema è che adesso quando clicco su un elemento della prima lista la pagina diventa vuota :-(

Offline aczepod

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Play Store ID:
    aczepod
  • Sistema operativo:
    Ubuntu 11.04
Re:Cursori e liste
« Risposta #13 il: 13 Settembre 2011, 12:35:42 CEST »
0
ok, avevo dimenticato di chiudere i cursori...

   
Codice: [Seleziona]
protected void onListItemClick(ListView l, View v, int position, long id) {
                Cursor comics = null;
                String selection = l.getItemAtPosition(position).toString();
                wecDatabasesManager databaseHelper = new wecDatabasesManager(this);
                Cursor series = databaseHelper.getSeriesIdByName(selection);
                while (series.moveToNext())
                {
                        comics = databaseHelper.getComics(series.getLong(0));
                }
                series.close();
               
                for (comics.moveToFirst(); !comics.isAfterLast(); comics.moveToNext()) {
                        //fetching from database and adding to arrayList
                        comicsList.add(comics.getString(comics.getColumnIndex(wecComicsTable.NUMBER)));
                }
                comics.close();
               
                //display in screen
                this.setListAdapter(
                                new ArrayAdapter<Object>(
                                                WhatelsecomicsActivity.this,
                                                android.R.layout.simple_list_item_1,
                                                comicsList
                                )
                );
        }

adesso funziona.
Unico problema è che quando clicco sull'icona <-per tornare indietro esco dall'applicazione. Immagino dipenda dal fatto che stando in una sola activity non ha nessun punto a cui tornare.
Secondo voi come posso risolvere questo problema?