tags:

views:

34

answers:

3
+1  Q: 

Database Quandry

Been trying to get an answer on what I am doing wrong all over the place. I would like the user to select a button in the calling class, open a called listactivity which displays the contents of a database, let the user click an entry, copy that entry into a new database, send back the rowid from the new database to the calling class and have the calling class assign the title from the new database entry to the original button that was pushed.

Here is the calling class

static final private int CHOOSE_MONDAY = 0; 
static final private int CHOOSE_TUESDAY = 0;
 private int ButtonPushed = 0; 
private NotesDbAdapter mDbHelper; 
private MenuDbAdapter menuDbHelper; 
private Long mRowId;
 String menuTitle; 
String menuProtein; 
String menuBody;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.plan_menu);

    Toast.makeText(this, "Choose a day to pick a meal for!", Toast.LENGTH_LONG).show();
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();
    menuDbHelper = new MenuDbAdapter(this);
    menuDbHelper.open();



}

public void mButtonHandler(View target)
{
    switch(target.getId())
    {
    case R.id.monday:
        // Create new intent object and tell it to call the ColorPicker class
        Intent question = new Intent(this, PlanMenuList.class); 
        // Start ColorPicker as a new activity and wait for the result 
        startActivityForResult(question, CHOOSE_MONDAY);
        break;
    case R.id.tuesday:
        // Create new intent object and tell it to call the ColorPicker class
        Intent question1 = new Intent(this, PlanMenuList.class);    
        // Start ColorPicker as a new activity and wait for the result 
        startActivityForResult(question1, CHOOSE_TUESDAY);
        break;
    }

And then this is the called class where I am trying to copy in the user's selection to the new database and then send back the id to the calling class.

public class PlanMenuList extends ListActivity {

private NotesDbAdapter mDbHelper;
private MenuDbAdapter menuDbHelper;
private List<Data>data;
String menuTitle;
String menuProtein;
String menuBody;
private Long mRowId;




/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.notes_list);
    mDbHelper = new NotesDbAdapter(this);
    menuDbHelper = new MenuDbAdapter(this);
    mDbHelper.open();
    menuDbHelper.open();
    fillData(); 
}

private void fillData() {
    Cursor notesCursor = mDbHelper.fetchAllNotes();
    startManagingCursor(notesCursor);

    // Create an array to specify the fields we want to display in the list (only TITLE)
    String[] from = new String[]{NotesDbAdapter.KEY_TITLE};

    // and an array of the fields we want to bind those fields to (in this case just text1)
    int[] to = new int[]{R.id.text1};

    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter notes = 
            new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to);
    setListAdapter(notes);

}

private void populateFields() {
    if (mRowId != null) {
        Cursor note = mDbHelper.fetchNote(mRowId);
        startManagingCursor(note);
        menuTitle=(note.getString(
                note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
        menuProtein=(note.getString(
                note.getColumnIndexOrThrow(NotesDbAdapter.KEY_PROTEIN)));
        menuBody=(note.getString(
                note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
    }
}





protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    mDbHelper.fetchNote(id);
    mRowId = id;
    //populateFields();
    menuDbHelper.createMenu("Monday", menuTitle, menuProtein, menuBody);
    Intent answer = new Intent();
    answer.putExtra("MenuDbAdapter.KEY_ROWID", mRowId);
    setResult(RESULT_OK, answer);
    finish();



}
}

I have been messing around with this thing for days and can't seem to get it to do what I want - any help would be appreciated.

A: 

Can you post your onActivityResult implementation? When I've passed data back to an activity as a result, I've used Bundles. For example:

Intent answer = new Intent();
Bundle extras = new Bundle();
extras.putLong("MenuDbAdapter.KEY_ROWID", mRowId);
answer.putExtras(extras);

Then, in the activity result handler, you'd call Intent.getExtras and pull your value from there.

Edit: here are some examples from the android dev guide: http://developer.android.com/guide/appendix/faq/commontasks.html (search for onActivityResult) http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html

Jim Schubert
Thank you so much for your help with this, I appreciate it. I didn't realize that getExtra and getExtras were two totally different things...maybe buying a book isn't that bad an idea.
Will
No problem. You can also look at code for Android base applications on Google Code. go to www.google.com/codesearch and search, for example: `calendar package:"git://android.git.kernel.org" lang:java`
Jim Schubert
A: 
protected void onListItemClick(ListView l, View v, int position, long id) {

the variable id is not the same as the database row number and thats where the issue is. I'd create a custom adapter and store the _id (row number) as a tag in the view. Retrieve the tag in the OnItemClickListener and do the db queries.

Custom Adapter code: private class Cursy extends CursorAdapter {

    public Cursy(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        viewHolder holder = (viewHolder) view.getTag();

        holder.tv.setText(cursor.getString(cursor
                .getColumnIndex(NotesDbAdapter.KEY_TITLE)));
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        viewHolder holder = new viewHolder();
        holder._id = ursor.getString(cursor.getColumnIndex(NotesDbAdapter._ID));

        View v = getLayoutInflater().inflate(
                R.layout.list_layout, null);

        holder.tv = (TextView) v
                .findViewById(R.id.tv);

        v.setTag(holder);
        return v;
    }

}

OnItemClickListener:

mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            viewHolder holder = (viewHolder) view.getTag();

            // use holder._id and do the db queries
        }
    });
Sameer Segal
This went way over my head, I have not looked at what "Tags" are. Thank you for the reply though, I appreciate it and shall add your answer to my list of "things to look up and try to wrap my head around". :)
Will
A: 

Firstly, I think you want to make sure your CHOOSE_MONDAY and CHOOSE_TUESDAY constants are different values, so that you can differentiate between them later.

Secondly, you are sending back the wrong row ID to your original activity. Assuming your createMenu() method is based on SQLiteDatabase.insert(), it should return the row ID after insertion (or -1 if there was a problem). You can use this as the row ID:

    mRowId = menuDbHelper.createMenu("Monday", menuTitle, menuProtein, menuBody);
antonyt