Question

I am attempting to delete a record from my database,

Short Summary:

  1. My database populates a listview
  2. The user can click the listview and view more details on a new activity
  3. I want to able to delete the record from this new activity

CODE

I have a class named ModuleDatabaseHandler that manages the database. In this, I have a method called getData() that populates records to a ListView in ActivityViewAll:

ModuleDatabaseHandler

public ArrayList<String> getData() {
    // TODO Auto-generated method stub

    String[] columns = new String[] { KEY_ROWID, KEY_MODULE_CODE,
            KEY_MODULE_NAME, KEY_LECTURE_PRACTICAL,
            KEY_LECTURE_PRACTICAL_SHORT, KEY_LECTURE_DAY,
            KEY_LECTURE_DAY_SHORT, KEY_START_TIME, KEY_END_TIME,
            KEY_LOCATION, ADDITIONAL_INFO };
    Cursor c = ourDatabase.query(DATABASE_MODULES, columns, null, null,
            null, null, null);
    ArrayList<String> results = new ArrayList<String>();

    int indexModCode = c.getColumnIndex(KEY_MODULE_CODE);

    int indexLectPracShort = c.getColumnIndex(KEY_LECTURE_PRACTICAL_SHORT);

    int indexLectDayShort = c.getColumnIndex(KEY_LECTURE_DAY_SHORT);
    int indexLectStart = c.getColumnIndex(KEY_START_TIME);

    int indexLectLoc = c.getColumnIndex(KEY_LOCATION);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        results.add(c.getString(indexModCode) + " "
                + c.getString(indexLectPracShort) + " "
                + c.getString(indexLectDayShort) + " "
                + c.getString(indexLectStart) + " "
                + c.getString(indexLectLoc));
    }



return results;
    }

This data is read in by ActivityViewAll:

ActivityViewAll

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_modules_test);

    ModuleDatabaseHandler info = new ModuleDatabaseHandler(this);
    info.open();
    ArrayList<String> data = info.getData();
    info.close();

    l = (ListView) findViewById(R.id.listView1);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, data);
    l.setAdapter(adapter);
    l.setOnItemClickListener(this);

}

I have another method in the ModuleDatabaseHandler class called getAllData() that allows the user to press a ListView item and read full details about the item on a new activity, ActivityFullDetails:

    public String getAllData(int specified_position) {
        // TODO Auto-generated method stub
        int position = specified_position;

        if(c.moveToPosition(specified_position)) {
            String result = "";
            for(int columnIndex = 0; columnIndex<c.getColumnCount();columnIndex++) {
                result += c.getString(columnIndex)+" ";
            }
            return result;
        } else {
            throw new IllegalArgumentException("Row " + specified_position + " does not exist");
        }

}

The data is transfered from the listView in ActivityViewAll to ActivityFullDetails using onItemClick:

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

    TextView temp = (TextView) view;
    Toast.makeText(this, temp.getText() + " " + i, Toast.LENGTH_SHORT)
            .show();

    ModuleDatabaseHandler info = new ModuleDatabaseHandler(this);
    info.open();
    String module_info = info.getAllData(i);
    info.close();

    Intent fullModuleDetails = new Intent();
    fullModuleDetails.setClassName("com.example.collegetimetable",
            "com.example.collegetimetable.ModuleDetails");

    fullModuleDetails.putExtra("list1", module_info);

    startActivity(fullModuleDetails);

}

Back in the ModuleDatabaseHandler class, I created a method called deleteEntry to attempt to delete a row:

public void deleteEntry(long row){
    ourDatabase.delete(DATABASE_MODULES,  KEY_ROWID + "=" + row, null);

}

The Problem

How can I pass the ROW_ID from the ModuleDatabaseHandler class to the listView in ActivityViewAll and then to the ActivityFullDetails so I can delete the record?

SOLVED

Thanks to Serge who helped me solve this, by creating a getRowId method as seen in the accepted answer. Although I did have to add a cursor query within the method which is not shown in the accepted answer i.e.:

    public int getRowID(int specified_position) {
    String[] columns = new String[]{ KEY_ROWID, KEY_MODULE_CODE, KEY_MODULE_NAME, KEY_LECTURE_PRACTICAL, KEY_LECTURE_DAY, KEY_START_TIME,KEY_END_TIME, KEY_LOCATION, ADDITIONAL_INFO};
    Cursor c = ourDatabase.query(DATABASE_MODULES, columns, null, null, null, null, null);
// rest of method as shown below
}

This method is called in the ActivityViewAll activity page from an instance of ModuleDatabaseHandler class, passed to the ActivityFullDetails page using putExtra,(and received using getIntent().getExtras as usual)..the delete method can then use the rowid.

Was it helpful?

Solution

Add function

public int getRowID(int specified_position) {
    int position = specified_position;
    if(c.moveToPosition(specified_position)) {
        return c.getInteger(c.getColumnIndex(KEY_ROWID));
    } else {
        throw new IllegalArgumentException("Row " + specified_position + " does not exist");
    }

}

And then to get it use

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

TextView temp = (TextView) view;
Toast.makeText(this, temp.getText() + " " + i, Toast.LENGTH_SHORT)
        .show();

ModuleDatabaseHandler info = new ModuleDatabaseHandler(this);
info.open();
String module_info = info.getAllData(i);
int rowID = info.getRowID(i);
info.close();

Intent fullModuleDetails = new Intent();
fullModuleDetails.setClassName("com.example.collegetimetable",
        "com.example.collegetimetable.ModuleDetails");

fullModuleDetails.putExtra("list1", module_info);
fullModuleDetails.putExtra("rowid", rowID);

startActivity(fullModuleDetails);

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top