Autore Topic: ListView con eliminazione dato da SQLite  (Letto 205 volte)

Offline SF

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Zenfone 2Laser
  • Sistema operativo:
    Windows 7
ListView con eliminazione dato da SQLite
« il: 14 Marzo 2017, 18:32:01 CET »
0
Ciao a tutti,
la mia applicazione visualizza dei dati, inseriti all'interno di un database, in un Fragment tramite RecyclerView e Adapter, fino a qui tutto ok (immagine). Il problema si presenta all'atto dell'eliminazione, in quanto mi restituisce un "a null object reference".
Tramite Debug noto che manca il passaggio di qualcosa, o almeno così mi sembra, ma non capisco.
Se potete darmi una dritta, anche di qualche miglioria del codice.
Grazie mille!

Questo è il codice del Fragment:
Codice (Java): [Seleziona]
public class Fragment_MassaRimorchiata extends Fragment {

    private AsyncTask_Massa_Rimorchiata asyncTaskMassaRimorchiata;
    private String sPosition;

    RecyclerView recyclerView;
    Adapter_Massa_Rimorchiata adapter;
    RecyclerView.LayoutManager layoutManager;
    ArrayList<EtichetteMasse> etichette_masse = new ArrayList<>();

    Gestione_DB_Massa_Rimorchiata gestione_db_massaRimorchiata;
    SQLiteDatabase db;
    FloatingActionButton fab;

    public Fragment_MassaRimorchiata() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_massa_rimorchiata_layout, container, false);
        fab = (FloatingActionButton) view.findViewById(R.id.fab_massa_rimorchiata);
        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_DB_massaRimorchiata);

        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), Activity_MassaRimorchiata.class);
                startActivity(intent);
            }
        });

        gestione_db_massaRimorchiata = new Gestione_DB_Massa_Rimorchiata(getActivity());
        asyncTaskMassaRimorchiata = new AsyncTask_Massa_Rimorchiata(getActivity());
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);

        adapter = new Adapter_Massa_Rimorchiata(etichette_masse, getContext());
        recyclerView.setAdapter(adapter);
        recyclerView.setOnScrollListener(new MyRecyclerScroll() {
            @Override
            public void show() {
                fab.animate().translationY(0).setInterpolator(new DecelerateInterpolator(1)).start();
            }

            @Override
            public void hide() {
                fab.animate().translationY(fab.getHeight() + R.dimen.fab_margin).setInterpolator(new
                        AccelerateInterpolator(1)).start();
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        etichette_masse.clear();

        db = gestione_db_massaRimorchiata.getReadableDatabase();

        Cursor cursor = gestione_db_massaRimorchiata.recuperaDati(db);
        if (cursor.moveToFirst()) {
            do {
                EtichetteMasse etichetteMasse = new EtichetteMasse(cursor.getString(0), cursor.getString(1), cursor.getDouble(2));
                etichette_masse.add(etichetteMasse);
            } while (cursor.moveToNext());
        }

        gestione_db_massaRimorchiata.close();
        adapter.notifyDataSetChanged();
    }


    public void mBtnEliminaSelection(View view, int position) {

        if (view.isPressed()) {
            sPosition = String.valueOf(position);
            asyncTaskMassaRimorchiata.execute("elimina_dato", sPosition);
    }
}

Adapter:
Codice (Java): [Seleziona]
public class Adapter_Massa_Rimorchiata extends RecyclerView.Adapter<Adapter_Massa_Rimorchiata.MasseViewHolder> {

    private ArrayList<EtichetteMasse> etichette_masse = new ArrayList<>();
    Context context;

    public Adapter_Massa_Rimorchiata(ArrayList<EtichetteMasse> etichette_masse, Context context) {
        super();
        this.etichette_masse = etichette_masse;
        this.context = context;
    }

    @Override
    public Adapter_Massa_Rimorchiata.MasseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.schede_massa_rimorchiata_layout, parent, false);
        return new MasseViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final Adapter_Massa_Rimorchiata.MasseViewHolder holder, int position) {
        EtichetteMasse etichetteMasse = etichette_masse.get(position);
        holder.Data.setText(etichetteMasse.getData());
        holder.MdO.setText(etichetteMasse.getMdO());
        holder.Massa_MdO.setText(etichetteMasse.getSomma_MdO() + "t");
    }

    @Override
    public int getItemCount() {
        return etichette_masse.size();
    }

    public static class MasseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView Data, MdO, Massa_MdO;
        Fragment_MassaRimorchiata fragment_massaRimorchiata;
        private ImageButton imageButton;

        public MasseViewHolder(View view) {
            super(view);

            fragment_massaRimorchiata = new Fragment_MassaRimorchiata();
            Data = (TextView) view.findViewById(R.id.view_Data);
            MdO = (TextView) view.findViewById(R.id.view_MdO);
            Massa_MdO = (TextView) view.findViewById(R.id.view_massa_MdO);
            imageButton = (ImageButton)view.findViewById(R.id.btnElimina);
            imageButton.setOnClickListener(this);    
        }

        @Override
        public void onClick(View view) {
            final int adapterPosition = MasseViewHolder.this.getAdapterPosition()+1;
            fragment_massaRimorchiata.mBtnEliminaSelection(view, adapterPosition);
        }
    }
}

AsyncTask:
Codice (Java): [Seleziona]
@Override
    protected String doInBackground(String... params) {

        // Richiamo salvataggio dati nel database massa rimorchiata
        String method = params[0];
        Gestione_DB_Massa_Rimorchiata gestione_db_massaRimorchiata = new Gestione_DB_Massa_Rimorchiata(ctx);
        if(method.equals("salva_dati")) {
            String data = params[1];
            String md = params[2];
            double somma = Double.parseDouble(params[3]);
            SQLiteDatabase db = gestione_db_massaRimorchiata.getWritableDatabase();
            gestione_db_massaRimorchiata.salvaMdO(db, data, md, somma);
            return "Dato Salvato";
        }
        if (method.equals("elimina_dato")) {
            int row = Integer.parseInt(params[1]);
            SQLiteDatabase db = gestione_db_massaRimorchiata.getWritableDatabase();
            gestione_db_massaRimorchiata.eliminaDato(db, row);
        }
        return null;
    }

Gestione DB parte che gestisce l'eliminazione:
Codice (Java): [Seleziona]
public boolean eliminaDato(SQLiteDatabase db, int row) {
        String selection = Database_Massa_Rimorchiata.Dati_Database_MassaRimorchiata._ID + "=" + row;
        db.delete(Database_Massa_Rimorchiata.Dati_Database_MassaRimorchiata.NOME_TABELLA, selection, null);
        return true;
    }

LogCat:
Codice: [Seleziona]
03-14 13:27:40.943 12781-12781/com.sebastiano.apppadova D/AndroidRuntime: Shutting down VM
03-14 13:27:40.943 12781-12781/com.sebastiano.apppadova E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.sebastiano.apppadova, PID: 12781
                                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.AsyncTask com.sebastiano.apppadova.AsyncTask_Massa_Rimorchiata.execute(java.lang.Object[])' on a null object reference
                                                                              at com.sebastiano.apppadova.Fragment_MassaRimorchiata.mBtnEliminaSelection(Fragment_MassaRimorchiata.java:121)
                                                                              at com.sebastiano.apppadova.Adapter_Massa_Rimorchiata$MasseViewHolder.onClick(Adapter_Massa_Rimorchiata.java:159)
                                                                              at android.view.View.performClick(View.java:4756)
                                                                              at android.view.View$PerformClick.run(View.java:19749)
                                                                              at android.os.Handler.handleCallback(Handler.java:739)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:135)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5221)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at java.lang.reflect.Method.invoke(Method.java:372)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
« Ultima modifica: 13 Aprile 2017, 20:33:44 CEST da SF »

Offline SF

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Zenfone 2Laser
  • Sistema operativo:
    Windows 7
ListView con eliminazione dato da SQLite
« Risposta #1 il: 13 Aprile 2017, 20:32:48 CEST »
0
Ho modificato la visualizzazione con una ListView, funziona tutto correttamente. Sono arrivato al punto in cui dovrei passare l'ID della riga del database da cancellare tramite la ActionBar in editMode con la selezione e cancellazione multipla ma non saprei come fare.

Codice (Java): [Seleziona]
public class Product {

    private int id;
    private String data, mdo;
    private double sommaMdO;

    public Product(int id, String data, String mdo, Double sommaMdO) {
        this.setId(id);
        this.setData(data);
        this.setMdo(mdo);
        this.setSommaMdO(sommaMdO);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getMdo() {
        return mdo;
    }

    public void setMdo(String mdo) {
        this.mdo = mdo;
    }

    public double getSommaMdO() {
        return sommaMdO;
    }

    public void setSommaMdO(double sommaMdO) {
        this.sommaMdO = sommaMdO;
    }
}

Codice (Java): [Seleziona]
public class ProductAdapter extends ArrayAdapter {

    private List list = new ArrayList();

    public ProductAdapter(Context context, int resource) {
        super(context, resource);
    }

    public void add(Product object) {
        super.add(object);
        list.add(object);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        ProductHolder productHolder;
        if (view == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(R.layout.display_product_row, parent, false);
            productHolder = new ProductHolder();
            productHolder.Data = (TextView) view.findViewById(R.id.view_Data);
            productHolder.MdO = (TextView) view.findViewById(R.id.view_MdO);
            productHolder.MassaMdO = (TextView) view.findViewById(R.id.view_massa_MdO);
            view.setTag(productHolder);
        } else {
            productHolder = (ProductHolder) view.getTag();
        }
        Product product = (Product) getItem(position);
        productHolder.Data.setText(product.getData().toString());
        productHolder.MdO.setText(product.getMdo().toString());
        productHolder.MassaMdO.setText(Double.toString(product.getSommaMdO()));

        return view;
    }

    static class ProductHolder {
        private TextView Data, MdO, MassaMdO;
    }
}

Codice (Java): [Seleziona]
listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
        listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {
                if (checked) {
                    final int checkedCount = listView.getCheckedItemCount();
                    actionMode.setTitle(checkedCount + " Selezionato");
                }
            }

            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                MenuInflater menuInflater = new MenuInflater(getContext());
                menuInflater.inflate(R.menu.menu_toolbar_action_mode, menu);
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode actionMode) {
            }
        });

Offline SF

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Zenfone 2Laser
  • Sistema operativo:
    Windows 7
Re:ListView con eliminazione dato da SQLite
« Risposta #2 il: 24 Aprile 2017, 19:54:26 CEST »
0
Ho proseguito con la scrittura e prove del codice ma alla premuta del tasto "Ok" dell'AlertDialog mi restituisce un errore in cui sembra non trovare le colonne.

Codice alla premuta dell'item della ListView:
Codice (Java): [Seleziona]
listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
        listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {

                ProductAdapter productAdapter = new ProductAdapter(getContext(), R.layout.display_product_row, selectedPosition);
                if (checked) {
                    selectedPosition.add((int) productAdapter.getItemId(position));
                    //productAdapter.setSelectedIndex(selectedPosition);
                    productAdapter.notifyDataSetChanged();
                    selecedNumItem(selectedPosition.size(), actionMode);
                } else {
                    selectedPosition.remove(position);
                    selecedNumItem(selectedPosition.size(), actionMode);
                }
            }

            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                MenuInflater menuInflater = new MenuInflater(getContext());
                menuInflater.inflate(R.menu.menu_toolbar_action_mode, menu);
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.action_delete:
                        try {

                            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext());
                            alertDialogBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    gestione_db_massaRimorchiata.eliminaDato(db, selectedPosition);
                                    onResume();
                                }
                            })
                                    .setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialogInterface, int i) {

                                        }
                                    })
                                    .setTitle("Elimina Dati")
                                    .setMessage("Vuoi eliminare i dati selezionati?")
                                    .create()
                                    .show();

                        } catch (Exception e) {

                        }

                }
                return true;
            }

            @Override
            public void onDestroyActionMode(ActionMode actionMode) {
            }
        });
    }

Gestione DB eliminazione del/i dato/i:
Codice (Java): [Seleziona]
public void eliminaDato(SQLiteDatabase db, ArrayList<Integer> id) {
        String selection = DatabaseMassaRimorchiata.Dati_Database_MassaRimorchiata._ID + " = " + id;
        db.delete(DatabaseMassaRimorchiata.Dati_Database_MassaRimorchiata.NOME_TABELLA, selection, null);
    }

LogCat:
Codice: [Seleziona]
04-24 17:37:13.136 21872-22028/com.sebastiano.apppadova D/DatabaseMassaMdOCreate: Database creato
04-24 17:37:22.532 21872-21872/com.sebastiano.apppadova E/SQLiteLog: (1) no such column: 0, 1, 2, 3
04-24 17:37:22.532 21872-21872/com.sebastiano.apppadova D/AndroidRuntime: Shutting down VM
04-24 17:37:22.533 21872-21872/com.sebastiano.apppadova E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.sebastiano.apppadova, PID: 21872
                                                                          android.database.sqlite.SQLiteException: no such column: 0, 1, 2, 3 (code 1): , while compiling: DELETE FROM Massa_Rimorchiata WHERE _id = [0, 1, 2, 3]
                                                                              at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                              at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:888)
                                                                              at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:499)
                                                                              at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                              at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                              at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                                              at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1498)
                                                                              at com.sebastiano.apppadova.GestioneDbMassaRimorchiata.eliminaDato(GestioneDbMassaRimorchiata.java:62)
                                                                              at com.sebastiano.apppadova.fragment.DispalyProduct$2$2.onClick(DispalyProduct.java:136)
                                                                              at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6066)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:770)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:660)