【发布时间】:2018-02-01 00:27:28
【问题描述】:
我真的需要你的帮助。我正在使用回收视图,但此时我正在尝试调试我的代码并通过 LogCat 检查我可能的错误源。从代码中,每当我通过单击方法删除数据(学校班级)时,我都会显示 SQLite 数据库中的内容,以查看数据是否真正被删除。当我单击删除按钮删除特定数据(学校班级)时,它应该在 LogCat 中显示 SQLite 数据库中的所有内容,但已删除的特定内容除外。
但目前,数据库显示所有内容,包括预期删除的内容。可能是什么问题,内容实际上被删除了吗?我的整个代码可能有什么问题。我将非常感谢您的回答。谢谢!!
这里是带有 onclick 方法的 AdapterClass,用于 onclick 事件。注意removeAt(getLayoutPosition());
public class ClassListOnSetupRecyclerAdapter extends RecyclerView.Adapter<ClassListOnSetupRecyclerAdapter.ClassListViewOnSetupHolder>{
//simple list of classes(mDataSet for Adapter)
private List<ClassesBean> listClasses;
private RecyclerView mRecyclerView;
private Context mContext;
public ClassListOnSetupRecyclerAdapter(List<ClassesBean> listClasses){
this.listClasses = listClasses;
}
@Override
public ClassListViewOnSetupHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_classesname_recycler,parent,false);
return new ClassListViewOnSetupHolder(itemView);
}
@Override
public void onBindViewHolder(ClassListViewOnSetupHolder holder, int position) {
holder.textView_classname.setText(listClasses.get(position).getClasses_name());
}
@Override
public int getItemCount() {
Log.v(ClassListOnSetupRecyclerAdapter.class.getSimpleName(),""+listClasses.size());
return listClasses.size();
}
// The View Holder Class
public class ClassListViewOnSetupHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView textView_classname;
public Button delete_button_classsetup;
public ClassListViewOnSetupHolder(View itemView) {
super(itemView);
textView_classname = itemView.findViewById(R.id.textView_classname);
delete_button_classsetup = itemView.findViewById(R.id.delete_button_classsetup);
itemView.setOnClickListener(this);
delete_button_classsetup.setOnClickListener(this);
textView_classname.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
Log.i("Removed", "pressed");
if(view.equals(delete_button_classsetup)){
removeAt(getLayoutPosition());
Log.i("dbDel", "Successful");
}
}
}
removeAt() 方法
public void removeAt(int position){
demeaSQL.deleteAClass(classesBean);
listClasses.remove(position);
mRecyclerView.removeViewAt(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, listClasses.size());
notifyDataSetChanged();
if (demeaSQL != null) {
StringBuilder sb = new StringBuilder();
for (ClassesBean c : demeaSQL.getAllClasses()) {
sb.append(" ClassName= " + c.getClasses_name() + " ClassItemIndex= " + c.getClasses_item_index());
sb.append("\n");
}
Log.i("dbContent", sb.toString());
}
}
SQLDatabase 删除函数。
public void deleteAClass(ClassesBean aClass){
SQLiteDatabase db =this.getWritableDatabase();
db.delete(TABLE_CLASSES,COLUMN_CLASSES_ID + "=?",
new String[]{String.valueOf(aClass.getId())});
db.close();
}
创建 classes_table sql 查询
private String CREATE_CLASSES_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES + "("
+ COLUMN_CLASSES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASS_ITEM_INDEX + " NUMBER,"
+ COLUMN_CLASSES_NAME + " VARCHAR," + COLUMN_CLASSES_CODENAME + " VARCHAR, " + COLUMN_CLASSES_SECTIONS + " VARCHAR," + COLUMN_CLASSES_TEACHERS
+ " VARCHAR," + COLUMN_CLASSES_STUDENTS + " VARCHAR" + ")";
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_USER_TABLE);
sqLiteDatabase.execSQL(CREATE_SCHOOL_TABLE);
sqLiteDatabase.execSQL(CREATE_CLASSES_TABLE);
}
这是我的 ClassesBean 类。
public class ClassesBean {
private int id;
private int classes_item_index;
private String classes_name;
private String classes_codename;
private String classes_sections;
private String classes_teachers;
private String classes_students;
public int getClasses_item_index() {
return classes_item_index;
}
public void setClasses_item_index(int classes_item_index) {
this.classes_item_index = classes_item_index;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getClasses_name() {
return classes_name;
}
public void setClasses_name(String classes_name) {
this.classes_name = classes_name;
}
public String getClasses_codename() {
return classes_codename;
}
public void setClasses_codename(String classes_codename) {
this.classes_codename = classes_codename;
}
public String getClasses_sections() {
return classes_sections;
}
public void setClasses_sections(String classes_sections) {
this.classes_sections = classes_sections;
}
public String getClasses_teachers() {
return classes_teachers;
}
public void setClasses_teachers(String classes_teachers) {
this.classes_teachers = classes_teachers;
}
public String getClasses_students() {
return classes_students;
}
public void setClasses_students(String classes_students) {
this.classes_students = classes_students;
}
}
【问题讨论】:
-
所以您的问题实际上是关于为什么
delete似乎不起作用? -
尝试调试并查看
deleteAClass中发生了什么 - 它被调用了吗?它是在抛出异常吗?你需要交易吗?传入的值是否正确? -
尝试使用
public void deleteAClass(ClassesBean aClass){ SQLiteDatabase db =this.getWritableDatabase(); String id = String.valueOf(aClass.getId()); Cursor debug = db.query(TABLE_CLASS,null,COLUMN_CLASSES_ID + "=?",id,null,null,null); if (debug.getCount() < 1) { Log.d("DELETEACLASS","ID " + id + " not in table " + TABLE_CLASS + "!!!"); } debug.close(); db.delete(TABLE_CLASSES,COLUMN_CLASSES_ID + "=?", new String[]{String.valueOf(aClass.getId())}); db.close(); }然后查看日志。 -
上述(作为
deleteAClass方法的临时替代)将检查该行是否存在,如果不存在则将消息写入日志。这很可能是问题的原因。 -
是的@ScaryWombat 删除不起作用。在“removeAt”方法中调用 deleteAClass。至于调试,我正在通过 Logcat 检查我的内容,看看它是否真的在删除。