Autore Topic: problema sqlitedatabase  (Letto 478 volte)

Offline __teo__

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
problema sqlitedatabase
« il: 19 Luglio 2017, 15:18:34 CEST »
0
salve a tutti, ho un piccolo problema con l'eliminazione di una riga all'interno del mio database:

questo è il database creato nell' onCreate di SQLiteOpenHelper

    String CREDITCARD_TABLE = "CREATE TABLE " +
                "CREDITCARD" +
                 " ( ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "USERNAME TEXT, PASSWORD TEXT, " +
                "CREDITCARDNUMBER TEXT, PIN TEXT, COMMENTS TEXT);";
        db.execSQL(CREDITCARD_TABLE);

questo è il metodo che elimina una riga del database

  void DeleteRows(SQLiteDatabase sqLiteDatabase,String TABLE_NAME,Integer id){
        sqLiteDatabase.delete(TABLE_NAME, "ID = ?", new String[]{Integer.toString(id)});
        sqLiteDatabase.close();
    }

Questa funzione viene richiamata con una pressione prolungata di un elemento della mia recycler view, tramite getAdapterPosition prendo la posizione dell'elemento e la passo come ID cosi da eliminare la riga;
il problema sta nel fatto che l'ID non si aggiorna e sballa tutto al successivo richiamo del getAdapterPosition.

ho provato utlilizzando questo metodo prendendo spunto da un libro ma niente, non funziona

 void Delete(String TABLE_NAME,int getAdapterPosition){
        Cursor crs = sqLiteDatabase.query(TABLE_NAME,null,null,null,null,null,null,null);
        crs.moveToPosition(getAdapterPosition);
        sqLiteDatabase.delete(TABLE_NAME,"USERNAME ?= ",new String[]{new String(crs.getBlob(0))});
        //utilizzo getBlob poichè il database contiene un array di byte per ciascuna colonna ed utilizzare
        //getString solleverebbe un eccezione
    }

Come dovrei fare?

Offline iClaude

  • Utente normale
  • ***
  • Post: 311
  • Respect: +25
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:problema sqlitedatabase
« Risposta #1 il: 19 Luglio 2017, 15:42:04 CEST »
0
getAdapterPosition da la posizione nella lista, non l'id del record del database.
Nell'adapter della RecyclerView cosa usi x memorizzare la lista dei dati?

Offline __teo__

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:problema sqlitedatabase
« Risposta #2 il: 19 Luglio 2017, 16:57:58 CEST »
0
    Cursor cursor;
    Context ctx;

CardViewAdapter(Context ctx, Cursor cursor){
        this.cursor = cursor;
        this.ctx = ctx;
        inflater = LayoutInflater.from(ctx);
    }

 public void onBindViewHolder(MyCardViewHolder holder, int position) {

        holder.userText.setText(new String(cursor.getBlob(1)));
        holder.passwordText.setText(new String(cursor.getBlob(2)));
        cursor.moveToNext();

    }

utilizzo un cursor per muovermi e funziona, pochè nel momento in cui clicco su un elemento del recycler view e passo getAdapterPosition ritrovo la posizione corretta del database, che poi mi porta ad aprire un'activity contenente ulteriori dati; il problema sta nell'eliminare una particolare riga

Offline iClaude

  • Utente normale
  • ***
  • Post: 311
  • Respect: +25
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:problema sqlitedatabase
« Risposta #3 il: 19 Luglio 2017, 19:07:16 CEST »
0
Nel tuo codice noto questo problema...

Se la tua lista ha 5 elementi, all'inizio hai questa situazione:
a) posizioni nell'adapter (restituite da getAdapterPosition):
0, 1, 2, 3, 4
b) id dei record nel database:
0, 1, 2, 3, 4

Però se inizi a cancellare e aggiungere record nel database, potresti avere una situazione del tipo:
a) posizioni nell'adapter (restituite da getAdapterPosition):
0, 1, 2, 3, 4
b) id dei record nel database:
27, 77, 69, 80, 115

E' ovvio che non puoi utilizzare getAdapterPosition come id dei record da eliminare.
Per risolvere velocemente il problema, e ipotizzando che il Cursor impostato nell'adapter sia aggiornato, potresti richiamare il metodo moveToPosition del cursor passandogli il valore restituito da getAdapterPosition, e quindi recuperare l'id.

Per il resto non ho ben capito quali altri problemi hai.

Offline __teo__

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:problema sqlitedatabase
« Risposta #4 il: 20 Luglio 2017, 21:44:00 CEST »
0
ok, ho provato come hai detto tu e ho risolto, una cosa tanto semplice che mi ha fatto perdere un botto di tempo ahahah
Grazie mille!!