【问题标题】:Android: Delete record row in a SQLIte database from a fragmentAndroid:从片段中删除 SQLite 数据库中的记录行
【发布时间】:2016-07-16 04:30:37
【问题描述】:

我在 RecyclerView 中有 CardViews。在 CardView 上长按时,会打开一个 DialogFragment 以确认删除 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();
      }
  }

【问题讨论】:

  • 好的,我试试看。
  • 运气不好,数据行还在。
  • @Hack-R 我应该删除“SQLiteDatabase db = this.getWritableDatabase();
  • 好的。在 db.delete 下面添加:Log.d("test", "deleted:" + cardnum);?

标签: android database sqlite


【解决方案1】:

我认为您没有将托管活动/片段中的 cardnum 值传递给您的对话框,因此您总是尝试删除 cardnum=0 所以解决方案是你应该在一个包中传递 cardnum 并将其作为片段参数传递到你的对话框中,并在 onCreateView() 中获取值。 在你开始你的对话片段的地方添加这个

Bundle args = new Bundle();
args.putInt("cardnum", cardnum);
myFragment.setArguments(args);

在你的 onCreateView() 中

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;
}

【讨论】:

  • Ty,我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多