删除recyclerView和SQLite数据库上的列表项的两行

时间:2019-02-26 03:36:06

标签: java android sqlite android-recyclerview

我是编程的初学者,我想在recyclerView的每个项目列表上创建一个删除按钮。我从堆栈溢出中获得了一些引用,并且该引用仅在活动(布局)上用于删除项目的工作,但是当我再次运行活动时,所选项目再次显示。

我找到了一些有关stackoverflow的文章,并提出了从SQLite中删除的方法。但是,每次我调用删除功能时,我的应用程序都崩溃了,“不幸的是,该应用程序已停止”。

我希望有人能帮助我解决这个问题。

这是我的数据库助手类

public class DatabaseHelperClass extends SQLiteOpenHelper {
Log cat Database
public static String log = "DatabaseHelper";

//Databse version
public static final int DATABASE_VERSION = 1;

//Database name
public static final String DATABSE_NAME = "dbPig";

//Tables Name
public static final String TABLE_PIGINFO = "tb_pigInfo";

//Common and PigInfo Column Names
public static final String KEY_ID = "id";
public static final String KEY_NAMA = "nama";
public static final String KEY_TANGGAL_PENDAFTARAN = "tanggal_pendaftaran";


//table create statement
//table pig Info
public static final String CREATE_TABLE_PIGINFO = "CREATE TABLE "
        + TABLE_PIGINFO + "(" + KEY_ID + " INTEGER," + KEY_NAMA
        + " TEXT," + KEY_TANGGAL_PENDAFTARAN
        + " TEXT" +  ")";


public DatabaseHelperClass(Context context) {
    super(context, DATABSE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    //creating requaired table
    db.execSQL(CREATE_TABLE_PIGINFO);
      }


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // on upgrade drop older tables
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_PIGINFO);

    // create new tables
    onCreate(db);
}

public void insertdata(String nama, String tanggal_pendaftaran) {
    System.out.print("Tersimpan" + TABLE_PIGINFO);
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_NAMA, nama);
    contentValues.put(KEY_TANGGAL_PENDAFTARAN, tanggal_pendaftaran);
    db.insert(TABLE_PIGINFO, null, contentValues);

}


public List<PigInfoTable> getdata() {
    List<PigInfoTable> data = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("select * from " + TABLE_PIGINFO + " ;", null);
    StringBuffer stringBuffer = new StringBuffer();
    PigInfoTable pigInfoTable = null;
    while (cursor.moveToNext()) {

        pigInfoTable = new PigInfoTable();
        String nama = cursor.getString(cursor.getColumnIndexOrThrow("nama"));
        String tanggal_pendaftaran = cursor.getString(cursor.getColumnIndexOrThrow("tanggal_pendaftaran"));
        pigInfoTable.setNama(nama);
        pigInfoTable.setTanggal_pendaftaran(tanggal_pendaftaran);
        stringBuffer.append(pigInfoTable);
        data.add(0, pigInfoTable);
    }

    for (PigInfoTable mo : data) {

        Log.i("Hellomo", "" + mo.getNama());
    }

    return data;
}

public void delete(int position) {

       SQLiteDatabase db = this.getWritableDatabase();
    String table = TABLE_PIGINFO;
    String whereClause = KEY_ID;
    String [] whereArgs = new String[] {String.valueOf(position)};
    db.delete (table, whereClause, whereArgs);

     }

这里是我的适配器

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.Myholder> {

DatabaseHelperClass databaseHelper;

List <PigInfoTable> pigInfoTablesArrayList;


public RecycleAdapter(List <PigInfoTable> pigInfoTablesArrayList) {
    this.pigInfoTablesArrayList = pigInfoTablesArrayList;

}

class Myholder extends RecyclerView.ViewHolder{
    private TextView nama, tanggal_pendaftaran;
    private Button delete;

    public Myholder(View itemView) {
        super(itemView);

        nama = (TextView) itemView.findViewById(R.id.nama1);
        tanggal_pendaftaran = (TextView) itemView.findViewById(R.id.tanggal1);
        delete = (Button) itemView.findViewById(R.id.delete);


    }
}

@Override
public Myholder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_itempigview,null);
    return new Myholder(view);

}

@Override
public void onBindViewHolder(Myholder holder, final int position) {

        PigInfoTable pigInfoTable= pigInfoTablesArrayList.get(position);
        holder.nama.setText(pigInfoTable.getNama());
        holder.tanggal_pendaftaran.setText(pigInfoTable.getTanggal_pendaftaran());
        holder.itemView.setClickable(true);





        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                databaseHelper.delete(position);
                pigInfoTablesArrayList.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, pigInfoTablesArrayList.size());
                notifyDataSetChanged();


            }
        });



}



@Override
public int getItemCount() {

    return pigInfoTablesArrayList.size();
}

我正在尝试其他解决方案,但是发生了相同的错误

上的空对象引用
  

位置

错误

  

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void com.example.newbreedy.DatabaseHelperClass.delete(int)'           在com.example.newbreedy.RecycleAdapter $ 1.onClick(RecycleAdapter.java:66)

谢谢

2 个答案:

答案 0 :(得分:1)

com.example.newbreedy.DatabaseHelperClass.delete(int)'对空对象的引用 因为您尚未初始化的引用 DatabaseHelperClass databaseHelper;

所以添加。

databaseHelper =new DatabaseHelperClass (context);

在回收站适配器中

在您的代码中,您正在发送适配器位置,因此请在位置位置发送KEY_ID。

            databaseHelper.delete(position);
            pigInfoTablesArrayList.remove(position);
            notifyDataSetChanged();

答案 1 :(得分:0)

首先,您必须像这样在适配器中初始化DatabaseHelperClass

databaseHelper =new DatabaseHelperClass (context);

不需要调用删除功能,并像这样将删除的项目通知适配器,

databaseHelper.delete(position);
pigInfoTablesArrayList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, pigInfoTablesArrayList.size());