Android - 使用.putExtra将SQLite中的ID传递到新活动

时间:2014-05-08 18:53:44

标签: android sqlite android-intent

我正在android eclipse中写一个笔记记录应用程序。我的应用程序当前从SQLite数据库中选择所有注释,并使用它们填充ListView。此ListView是可单击的,并且当前将用户重定向到EditNote活动。

但是,我希望能够根据单击的ListView注释的ID填充EditNote活动中的EditTexts。

(因此,如果我点击第一个ListView项目并且它的ID为2,则值2将传递给EditNote)

这需要获取被单击的ListView项的ID,然后使用.putExtra()传递它;到EditNote活动。

所以我的问题是:如何获取ID然后将其传递给EditNote活动?这样我就可以使用该ID对该活动进行额外的查询。

非常感谢你的时间。 我会尽我所能回答任何其他问题。

初始化事项

    DatabaseHelper dbh;
    ArrayList<String> listItems = new ArrayList<String>();
    ArrayAdapter<String> adapter;
    Context mCtx;
    ListView lv;

使用onClickListeners的onCreate方法

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        refreshData();

        mCtx = this;

        lv = getListView();

        lv.setOnItemClickListener(new OnItemClickListener() {

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

               Intent i = new Intent(mCtx, EditNote.class);
               i.putExtra("ID", listItems.get(position));
               startActivity(i);
        }
        });

refreshData方法(用于填充ListView)

public void refreshData(){

         dbh = new DatabaseHelper(this);
            dbh.open();

            adapter = new ArrayAdapter<String> (this, android.R.layout.simple_list_item_1, listItems);

            setListAdapter(adapter);

            ArrayList<String[]> searchResult = new ArrayList<String[]>();

            //EditText searchTitle = (EditText) findViewById(R.id.searchC);

            listItems.clear();

            searchResult = dbh.fetchNotes("");
            //searchResult = dbh.fetchNotes(searchTitle.getText().toString());

            String title = "", note = "", id = "";


            for (int count = 0 ; count < searchResult.size() ; count++) {

                  note = searchResult.get(count)[2];
                  title = searchResult.get(count)[1];
                  id = searchResult.get(count)[0];


                  listItems.add(title);

            }                

                adapter.notifyDataSetChanged();

    }

    /*private void setID(String setID) {
        this.id = setID;

    }

    private String getID(){
        return id;
    }*/

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

DatabaseHelper活动 - fetchNotes - 用于查询数据库

public ArrayList<String[]> fetchNotes(String title) throws SQLException {


        ArrayList<String[]> myArray = new ArrayList<String[]>();

        int pointer = 0;     

        Cursor mCursor = mDb.query(TABLE_NAME, new String[] {"_id", "title",
                "note"}, null, null,
                    null, null, "_id");

        int idColumn = mCursor.getColumnIndex("_id");
        int titleColumn = mCursor.getColumnIndex("title");
        int noteColumn = mCursor.getColumnIndex("note");     

        if (mCursor != null){

           //If possible move to the first record within the cursor
           if (mCursor.moveToFirst()){

                do {
                    //for each record add a new string array to our Array List
                    myArray.add(new String[3]);
                    //
                    myArray.get(pointer)[0] = mCursor.getString(idColumn);
                    //Save the note into the string array
                    myArray.get(pointer)[1] = mCursor.getString(titleColumn);
                    //Save the title into the string array
                    myArray.get(pointer)[2] = mCursor.getString(noteColumn);
                    //increment our pointer variable.
                    pointer++;

                } while (mCursor.moveToNext()); // If possible move to the next record

           } else {
               myArray.add(new String[3]);
               myArray.get(pointer)[0] = "";
               myArray.get(pointer)[1] = "";
               myArray.get(pointer)[2] = "";
           }
        } 

        return myArray;
    }

此处还有我的创建表格,以防万一

private static final String DATABASE_CREATE =
                    "CREATE TABLE " + TABLE_NAME + " (" +
                    "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    "title TEXT NOT NULL, " +
                    "note TEXT NOT NULL); ";

2 个答案:

答案 0 :(得分:0)

我会尽力帮助您,我认为您的代码可以更加优化......

    你的fetchNotes()中的
  1. 只是返回光标而不是创建ArrayList,如果你假设你在这里创建了ArrayList并且它在你使用listItems ArrayList的调用函数中再次占用了100个条目...我知道android有垃圾收集器但是如果有选择可以避免使用呢?

  2. 你的myArray是String [] ArrayList但是你的listItems不是因此你只能访问这个标题因为这是你在这里存储的listItems.add(title);

    一个。因此,您可以直接在fetchNotes()中使用listItems,如MainActivity.listitems(假设在MainActivity类中声明listItem),在将ArrayList<String[]> listItems=new ArrayList<String[]>();声明为public static ArrayList<String[]> listItems=new ArrayList<String[]>();之后使用 或

    湾你只需返回光标,就像listItems上的myArray操作一样。

  3. 现在您可以访问&#34; id&#34;通过引用您在listItems中存储id的索引。

    listItems.get(position)[2](假设您将id存储在索引2处)。

    我尽量保持简单,并期望它会帮助你......

答案 1 :(得分:0)

不确定我完全理解这一点。你没有传递“标题”,你的数据库助手可以使用“标题”获取结果吗?这不起作用还是要通过传递ID来优化它?即使您想传递ID,也可以使用相同的机制来实现。