Autore Topic: Ricavare id Item nel DB con tocco dell\'item in listview per eliminarlo  (Letto 652 volte)

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Io ho una lista di conversazione , al tocco prolungato faccio apparire un alert che mi chiede se voglio eliminare o no la conversazione ( e fino a qua ci sono ) 
Se continuo premendo Elimina vado a questo metodo :

Codice (Java): [Seleziona]
public int delete(Uri uri, String selection, String[] selectionArgs)
{
                SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
                int count = db.delete(uri.getLastPathSegment(), selection, selectionArgs);
                getContext().getContentResolver().notifyChange(uri, null);
                return count;
}

Qualcuno che mi sa spiegare questo metodo e che cosa sono i parametri ?
Essendo gli item della listview presenti nel db , come ottengo l'id del item selezionato  ?

Post unito: 12 Febbraio 2014, 23:10:29 CET
una domanda simile e' stata fatta qua : http://www.anddev.it/index.php?topic=10376.0
ma neanche qui e' stata data una risposta.
« Ultima modifica: 12 Febbraio 2014, 23:10:29 CET da Trotto23, Reason: Merged DoublePost »

iClaude

  • Visitatore
Re:Ricavare id Item nel DB con tocco dell\'item in listview per eliminarlo
« Risposta #1 il: 13 Febbraio 2014, 12:43:49 CET »
0
Se la ListView è collegata al database con un Adapter, nei metodi onItemClick e onItemLongClick hai il parametro id che rappresenta l'id del record nel database.

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Ricavare id Item nel DB con tocco dell\\\'item in listview per eliminarlo
« Risposta #2 il: 13 Febbraio 2014, 14:45:38 CET »
0
Ok , per ora Uri ho capito cos'è . Adesso io l id glie lo devo settare in  selection,  o in selectionArgs ?

Post unito: 13 Febbraio 2014, 15:42:04 CET
Ho questo codice :
ID e' l'id dell'istanza,
Codice (Java): [Seleziona]
      mess = new MessagesContentProvider();
      String[] mio_id = new String[] {Long.toString(id)};
      String res=Long.toString(id);
      mess.delete(MessagesContentProvider.THREADS_URI, res+"=?" , mio_id);
      //Referesh
      mCursorAdapter.notifyDataSetChanged();

Non capisco cosa sbaglio .
« Ultima modifica: 13 Febbraio 2014, 15:42:04 CET da Trotto23, Reason: Merged DoublePost »

Offline BobArctor

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero, Galaxy S4, GP50
  • Play Store ID:
    Michele Valentini
  • Sistema operativo:
    Windows 8
Re:Ricavare id Item nel DB con tocco dell\'item in listview per eliminarlo
« Risposta #3 il: 13 Febbraio 2014, 16:46:14 CET »
+1
Ciao!
allora, io avevo lo stesso problema, solamente in circostanze leggermente diverse.
il mio db ha delle tabelle che ho creato su misura per i bean che utilizzo nel programma, e il DBHelper mi restituisce questi bean, in liste o singole istanze, popolati con i dati che ho nel db.

esempio:
tabella series:
_ID titolo note

bean Series: getter e setter di questi 3 campi.

ho esteso la classe ArrayAdapter<T> creando un SeriesAdapter<Series>, che imposta il titolo della serie come testo nel listview.
quando devo andare a modificare/eliminare la serie selezionata dalla listview (e dal database), uso il metodo:
Codice: [Seleziona]
mDBHelper.deleteSeriesByID(mAdapter.getItem(position).get_ID());
il metodo .getItem(position) mi restituisce di fatto un'istanza di Series, quindi, con il metodo .get_ID(), ottengo l'id salvato nel database.

SeriesAdapterOptimized:
Codice (Java): [Seleziona]
public class SeriesAdapterOptimized extends ArrayAdapter<Series> {

    public SeriesAdapterOptimized(Context context, int textViewResourceId,
                 List<Series> objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewOptimize(position, convertView, parent);
    }

    public View getViewOptimize(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.collection_item, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Series serie = getItem(position);
        viewHolder.name.setText(serie.getName());
     
       
        return convertView;
    }

    private class ViewHolder {
        public TextView name;
     
    }
}

collection_item.xml
Codice: [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >


    <TextView
        android:id="@+id/textViewName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
       
        />

   

</RelativeLayout>

il codice per inizializzare la listview e l'adapter:
Codice (Java): [Seleziona]
mList = mDBHelper.getSeriesList();
mAdapter = new SeriesAdapterOptimized(this, R.layout.collection_item, mList);
mListView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();

e infine il codice per l'eliminazione:
Codice (Java): [Seleziona]
mDBHelper.deleteSeriesByID(mAdapter.getItem(position).get_ID());
mAdapter.remove(mAdapter.getItem(position));
mAdapter.notifyDataSetChanged();

questo il metodo del DBHelper per cancellare la serie:
Codice (Java): [Seleziona]
public void deleteSeriesById(long series_id) {
                Log.d(TAG, "deleteSeries");
                SQLiteDatabase db = this.getWritableDatabase();
                deleteIssueBySeriesID(series_id);
                db.delete(CollectionTable.TABLE_NAME, CollectionTable._ID + " = ?",
                                new String[] { String.valueOf(series_id) });
        }
le due costanti CollectionTable.TABLE_NAME e CollectionTable._ID sono: nome della tabella, e nome del campo id della tabella.

così facendo posso modificare la riga della listview in futuro con altre "View" (ad esempio un altro TextView per le note) e lavorare con oggetti personalizzati.

                                    
« Ultima modifica: 13 Febbraio 2014, 16:49:14 CET da BobArctor »

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Ricavare id Item nel DB con tocco dell\'item in listview per eliminarlo
« Risposta #4 il: 14 Febbraio 2014, 16:59:14 CET »
0
Finalmente dopo due giorni di scervellamento ci sono riuscito. Il comando da fare e' :

Codice (Java): [Seleziona]
getContentResolver().delete(Uri,  "_id="+  id_item , null);
*Uri = La mia uri;
*id_item = id del item da rimuovere

Il metodo delete e' il seguente:

Codice (Java): [Seleziona]
@Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
                SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
                int count = db.delete(uri.getLastPathSegment(), selection, selectionArgs);
                getContext().getContentResolver().notifyChange(uri, null);
                return count;
        }

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Ricavare id Item nel DB con tocco dell\'item in listview per eliminarlo
« Risposta #5 il: 14 Febbraio 2014, 17:23:08 CET »
0
Io ho una lista di conversazione , al tocco prolungato faccio apparire un alert che mi chiede se voglio eliminare o no la conversazione ( e fino a

Magari una idea potrebbe essere quella di usare la ActionBar in edit mode, per uniformarsi ad un comportamento standard e poter fare anche la cancellazione multipla.

Ok , per ora Uri ho capito cos'è . Adesso io l id glie lo devo settare in  selection,  o in selectionArgs ?

Il campo Id, solitamente puoi anche passarlo con il semplice uri, se il content provider è scritto in un modo "standard".


ho esteso la classe ArrayAdapter<T> creando un SeriesAdapter<Series>, che imposta il titolo della serie come testo nel listview.
quando devo andare a modificare/eliminare la serie selezionata dalla listview (e dal database), uso il metodo:
Codice: [Seleziona]
mDBHelper.deleteSeriesByID(mAdapter.getItem(position).get_ID());                           

Si..ma perchè usare un ArrayAdapter lavorando con un db sotto.
A meno che la mole dati è piccola, un CursorAdapter è preferibile.

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Ricavare id Item nel DB con tocco dell\'item in listview per eliminarlo
« Risposta #6 il: 15 Febbraio 2014, 08:17:14 CET »
0
Magari una idea potrebbe essere quella di usare la ActionBar in edit mode, per uniformarsi ad un comportamento standard e poter fare anche la cancellazione multipla.



Sarebbe stato meglio come hai detto te ma , non voglio andarmi a complicare la vita.