Autore Topic: ListView e SimpleCursorAdapter  (Letto 1368 volte)

Offline ibrido90

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
ListView e SimpleCursorAdapter
« il: 08 Agosto 2012, 12:00:04 CEST »
0
Ciao ragazzi, sto cercando di fare un'app completamente inutile per esercitarmi nell'uso delle listView. A tal proposito ho preso il Tutorial  [facile] Aggiornare ListView popolata da un cursor + download e parsing JSON - Android Developers Italia ed ho iniziato a lavorarci togliendo tutto e cercando semplicemente di visualizzare degli elementi  inseriti automaticamente nel db all'avvio (si parlo di HardCoding[si lo so non si fa]). Ora al di fuori del dettaglio che il metodo startManagingCursor è deprecato, ma me ne sto strafregando, il mio problema è che mi dice che non esiste una colonna che esiste.
Si non sono molto chiaro.
Lascerò parlare il codice al posto mio :D
Codice (Java): [Seleziona]
public class MyListView extends Activity {
        ListView elementsLv;
        Cursor c;
        SimpleCursorAdapter adapter;
        CDb db;
        Character pg;
        @SuppressWarnings("deprecation")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                TextView titleTv = (TextView) findViewById(R.id.dbTv);
                elementsLv = (ListView) findViewById(R.id.elementsLv);
               
                db = new CDb(getApplicationContext());
                db.open();
                pg = new Character (0,"Martu");
                db.insertChar(pg);
                pg = new Character (1,"Sabe");
                db.insertChar(pg);
                pg = new Character (2,"Lol");
                db.insertChar(pg);
                c = db.fetchChar();
                startManagingCursor(c);
               
                adapter = new SimpleCursorAdapter(this, R.layout.listelement, c, new String[] {  Mix.PersonaggiMD.NOME_KEY }, new int[] {R.id.nameText} );
                elementsLv.setAdapter(adapter);
                //getWindow().setFormat(PixelFormat.RGBA_8888);
                int nChars = db.countRecords(Mix.PersonaggiMD.CHAR_TABLE);
                titleTv.setText("Database F1Db\n\tTabella " + Mix.PersonaggiMD.CHAR_TABLE + " , n° di Record: " + nChars + "\n");
               
                db.close();
        }
       
        @Override
        public void onResume() {
                db.open();
                c = db.fetchChar(); // query
                startManagingCursor(c);
                adapter = ((SimpleCursorAdapter) elementsLv.getAdapter());
                adapter.changeCursor(c);
                super.onResume();
                db.close();
        }
       
        @Override
        protected void onDestroy() {
                if (c != null && !c.isClosed())
                        c.close();
                db.close();
                super.onDestroy();
        }

        private void updateListView() {
                TextView titleTv = (TextView) findViewById(R.id.dbTv);
                db.open();
                c = db.fetchChar(); // query
                startManagingCursor(c);
                adapter.changeCursor(c);
                adapter.notifyDataSetChanged();
                int nChars = db.countRecords(Mix.PersonaggiMD.CHAR_TABLE);
                titleTv.setText("Database F1Db\n\tTabella " + Mix.PersonaggiMD.CHAR_TABLE + " , n° di Record: " + nChars + "\n");
                db.close();
        }

}

Codice (Java): [Seleziona]
public class CDb {
        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME = "characterdb";// nome del db
        private static final int DB_VERSION = 1;
       
        public CDb(Context ctx) {
                mContext = ctx;
                mDbHelper = new DbHelper(ctx, DB_NAME, null, DB_VERSION);
        }

        public void open() { // il database su cui agiamo è leggibile/scrivibile
                if (mDb == null || !mDb.isOpen())
                        mDb = mDbHelper.getWritableDatabase();
        }

        public void close() { // chiudiamo il database su cui agiamo
                if (mDb != null && mDb.isOpen())
                        mDb.close();
        }

        public void setmDbHelper(DbHelper mDbHelper) {
                this.mDbHelper = mDbHelper;
        }

        // i seguenti 2 metodi servono per la lettura/scrittura del db.
        public void insertChar(Character pg) {
                Log.d("pg name", pg.getNome());
                ContentValues cv = new ContentValues();
                cv.put(Mix.PersonaggiMD.ID, pg.getId());
                cv.put(Mix.PersonaggiMD.NOME_KEY, pg.getNome());
                mDb.insert(Mix.PersonaggiMD.CHAR_TABLE, null, cv);
                cv.clear();
        }
       
        public class DbHelper extends SQLiteOpenHelper{

                public DbHelper(Context context, String name, CursorFactory factory,
                                int version) {
                        super(context, name, factory, version);
                        // TODO Auto-generated constructor stub
                }

                @Override
                public void onCreate(SQLiteDatabase db) {
                        // TODO Auto-generated method stub
                        db.execSQL(Mix.TablesCreation.PERSONAGGI_TABLE_CREATE);
                }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                        // TODO Auto-generated method stub
                       
                }

        }

        public Cursor fetchChar() {
                // TODO Auto-generated method stub
                return mDb.rawQuery("SELECT _id FROM personaggi ", null);
        }

        public int countRecords(String charTable) {
                // TODO Auto-generated method stub
                Cursor c = mDb.rawQuery("SELECT COUNT(*) FROM " + charTable, null);
                c.moveToFirst();
                int count = c.getInt(0);
                c.close();
                return count;
        }
}

Codice (Java): [Seleziona]
public class Mix {
       
        public static class PersonaggiMD{
                public static final String CHAR_TABLE = "personaggi";
                public static final String ID = "_id";
                public static final String NOME_KEY = "nome";
        }
       
        public static class TablesCreation {

                public static final String PERSONAGGI_TABLE_CREATE = "CREATE TABLE " + PersonaggiMD.CHAR_TABLE + " (" +
                                PersonaggiMD.ID + " INTEGER Primary Key , " +
                                PersonaggiMD.NOME_KEY + " STRING NOT NULL )";
        }
}

--listelement.xml---
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:orientation="vertical" android:weightSum="10">
        <LinearLayout android:layout_height="0dp"
                android:layout_width="fill_parent" android:orientation="horizontal"
                android:layout_weight="2" android:weightSum="10">
                <TextView android:id="@+id/nameText" android:text="Nome:"
                        android:layout_width="0dp" android:layout_height="fill_parent"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="2" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/charName" android:text="prova2"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="10dp" android:layout_weight="8" android:textStyle="bold"
                        android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
</LinearLayout>

---main.xml---
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:id="@+id/dbTv"
                android:textColor="#FFFFFF" android:textSize="12dp" android:textStyle="bold" />
        <ListView android:id="@+id/elementsLv" android:layout_width="fill_parent"
                android:layout_height="fill_parent" android:dividerHeight="2dp"
                android:divider="#FFFFFF"></ListView>
</LinearLayout>

se voleste il LogCat ve lo posto, comunque mi insulta all'inserimento dei Nomi "Martu" ecc .. xD
Help please
:)
Yes i am noob :)

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:ListView e SimpleCursorAdapter
« Risposta #1 il: 08 Agosto 2012, 12:20:55 CEST »
0
Le cause potrebbero essere molte.

Una è che tu abbia modificato la struttura del database dopo aver lanciato una volta l'applicazione, per cui il database è già creato con la vecchia struttura e non trova le nuove colonne. Puoi facilmente scoprirlo in vari modi, esempio facendo un pull del database ed aprendolo con un sqlitemanager, oppure disinstallando l'app dall'emulatore e poi reinstallandola.

E comunque il LogCat postalo sempre, contiene molte più informazioni di quanto sembri.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ibrido90

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:ListView e SimpleCursorAdapter
« Risposta #2 il: 08 Agosto 2012, 12:33:19 CEST »
0
mm appena riesco posto il Log così sarà più chiaro...e comunque l'app la disinstallo e reinstallo ma non cambiano gli errori :(
Yes i am noob :)

Offline ibrido90

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:ListView e SimpleCursorAdapter
« Risposta #3 il: 08 Agosto 2012, 14:13:35 CEST »
0
Yes i am noob :)

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:ListView e SimpleCursorAdapter
« Risposta #4 il: 08 Agosto 2012, 14:21:21 CEST »
0

il problema e che provi a prelevare una colonna di nome "nome" che non viene trovata nel db..sicuro di costruire bene la tabella del db??

EDIT
cosa c'e nella riga 40 di mylistview??
« Ultima modifica: 08 Agosto 2012, 14:49:34 CEST da ciopper90 »

Offline ibrido90

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:ListView e SimpleCursorAdapter
« Risposta #5 il: 08 Agosto 2012, 15:26:39 CEST »
0
la riga 40 riguarda il simpleCursorAdapter O.o e non so proprio il problema
Yes i am noob :)

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:ListView e SimpleCursorAdapter
« Risposta #6 il: 08 Agosto 2012, 17:55:33 CEST »
+1
Qua:

Codice (Java): [Seleziona]
        public Cursor fetchChar() {
                // TODO Auto-generated method stub
                return mDb.rawQuery("SELECT _id FROM personaggi ", null);
        }

Pare tu abbia solo la colonna _id nel risultato della query. Mettici anche nome, oppure un *.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ibrido90

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:ListView e SimpleCursorAdapter
« Risposta #7 il: 14 Agosto 2012, 09:38:55 CEST »
0
Grazie Bradipao : )
Yes i am noob :)