Android:从片段中删除SQLIte数据库中的记录行
我在回收视图中有CardView。长按CardView时,将打开一个对话框片段,确认删除CardView及其来自SQLite数据库的数据。单击“确定”后,对话框关闭,DatabaseHelper文件中的“deletefromDB”方法设置为从数据库中的表中删除记录行。该方法使用CARDNUM列及其CARDNUM整数值来删除数据的记录行。虽然对话框按预期关闭,但不幸的是,当我在运行应用程序后检查数据库时,SQLite数据库中没有任何更改(我正在使用DB Browser for SQLite检查前后的数据库)。我错过了什么Android:从片段中删除SQLIte数据库中的记录行,android,database,sqlite,Android,Database,Sqlite,我在回收视图中有CardView。长按CardView时,将打开一个对话框片段,确认删除CardView及其来自SQLite数据库的数据。单击“确定”后,对话框关闭,DatabaseHelper文件中的“deletefromDB”方法设置为从数据库中的表中删除记录行。该方法使用CARDNUM列及其CARDNUM整数值来删除数据的记录行。虽然对话框按预期关闭,但不幸的是,当我在运行应用程序后检查数据库时,SQLite数据库中没有任何更改(我正在使用DB Browser for SQLite检查前后
DeleteCardViewFragment.java
public class DeleteCardViewFragment extends DialogFragment {
DatabaseHelper dbHelper;
private int cardnum = 0;
public DeleteCardViewFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
dbHelper = new DatabaseHelper(getActivity());
final View rootView = inflater.inflate(R.layout.delcardview_layout, container, false);
getDialog().setTitle("Delete skycard");
...
Button btnOK = (Button) rootView.findViewById(R.id.btnOK);
btnOK.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
**dbHelper.deletefromDB(cardnum);**
dismiss();
}
});
return rootView;
}
}
数据库表名称和列的DBContract.java文件
public final class DBContract {
public DBContract() {}
public static abstract class DBEntry implements BaseColumns {
public static final String TABLE_NAME_USERINPUTS = "userinputs";
public static final String COLUMN_NAME_ID = "_id";
public static final String COLUMN_NAME_CARDNUM = "cardnum";
public static final String COLUMN_NAME_TODO = "todo";
public static final String COLUMN_NAME_NOTE1 = "note1";
public static final String COLUMN_NAME_NOTE2 = "note2";
public static final String COLUMN_NAME_DUEDATE = "duedate";
public static final String COLUMN_NAME_DUETIME = "duetime";
public static final String COLUMN_NAME_TIMESTAMP = "timestamp";
}
}
DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper {
...
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE IF NOT EXISTS "+ DBContract.DBEntry.TABLE_NAME_USERINPUTS +
"(" + DBContract.DBEntry.COLUMN_NAME_ID +
" INTEGER PRIMARY KEY, " +
DBContract.DBEntry.COLUMN_NAME_CARDNUM +
" INTEGER," +
DBContract.DBEntry.COLUMN_NAME_TODO +
" TEXT," +
DBContract.DBEntry.COLUMN_NAME_NOTE1 +
" TEXT," +
DBContract.DBEntry.COLUMN_NAME_NOTE2 +
" TEXT," +
DBContract.DBEntry.COLUMN_NAME_DUEDATE +
" TEXT," +
DBContract.DBEntry.COLUMN_NAME_DUETIME +
" TEXT," +
DBContract.DBEntry.COLUMN_NAME_TIMESTAMP +
" INTEGER)";
**public void deletefromDB(int cardnum)** {
SQLiteDatabase db = this.getWritableDatabase();
// Delete the CardView's data row using the integer from cardum.
db.delete(DBContract.DBEntry.TABLE_NAME_USERINPUTS,
DBContract.DBEntry.COLUMN_NAME_CARDNUM + "= ?", new String[]{String.valueOf(cardnum)});
db.close();
}
}
我认为您没有将cardnum值从宿主活动/片段传递到对话框,因此您总是尝试删除cardnum=0 因此,解决方案是您应该在一个bundle中传递cardnum,并将其作为对话框中的片段参数传递,然后在onCreateView()中获取值。 在其中启动对话框片段并添加以下内容
Bundle args = new Bundle();
args.putInt("cardnum", cardnum);
myFragment.setArguments(args);
在您的onCreateView()中
好的,我会尝试一下。运气不好,数据行仍然存在。@Hack-R我应该删除“SQLiteDatabase db=this.getWritableDatabase();好的。将此添加到db.delete:Log.d(“test”,“deleted:+cardnum”);Ty,我会尝试一下。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
dbHelper = new DatabaseHelper(getActivity());
final View rootView = inflater.inflate(R.layout.delcardview_layout, container, false);
getDialog().setTitle("Delete skycard");
// add this
cardnum = getArguments().getInt("cardnum", 0);
Button btnOK = (Button) rootView.findViewById(R.id.btnOK);
btnOK.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.deletefromDB(cardnum);
dismiss();
}
});
return rootView;
}