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

Android-使用.putExtra将ID从SQLite传递到新活动中,android,sqlite,android-intent,Android,Sqlite,Android Intent,我正在android eclipse中编写一个笔记应用程序。我的应用程序当前从SQLite数据库中选择所有注释,并使用它们填充ListView。此ListView可单击,并且当前将用户重定向到EditNote活动 但是,我希望能够根据单击的ListView注释的ID在EditNote活动中填充EditText (因此,如果我单击了第一个ListView项,其ID为2,则值2将传递给EditNote) 这需要获取单击的ListView项的ID,然后使用.putExtra()将其传递给用户;转到Ed

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

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

(因此,如果我单击了第一个ListView项,其ID为2,则值2将传递给EditNote)

这需要获取单击的ListView项的ID,然后使用.putExtra()将其传递给用户;转到EditNote活动

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

非常感谢您抽出时间。 我将尽我所能回答任何其他问题

初始化事物


我会尽力帮助你,我也认为你的代码可以更优化

  • 在fetchNotes()中,如果您在此处创建了ArrayList,并且它在调用方函数中再次占用了100个条目,那么只需返回光标而不是创建ArrayList,您使用的是listItems ArrayList。。。我知道android有垃圾收集器,但如果有避免的选择,为什么要使用它呢

  • 您的myArray是String[]ArrayList,但您的listItems不是,因此您只能访问标题,因为这是您存储在此处的内容
    listItems.add(title)

    a。因此,您可以直接在fetchNotes()中使用listItems,如
    MainActivity.listItems
    (假设listItem在MainActivity类中声明)在声明
    ArrayList listItems=new ArrayList()后使用作为公共静态ArrayList listItems=new ArrayList()

    b。您只需返回游标,并执行与listItems上myArray类型的操作完全相同的操作

  • 现在,您可以通过引用在listItems中存储id的索引来访问“id”

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


    我试着让它尽可能简单,希望它能帮助你……

    我不确定我是否完全理解这一点。您是否已经传递了“title”并且您的数据库助手可以使用“title”获取结果?这是否不起作用,或者您希望通过传递ID来优化它?即使您希望传递ID,也可以使用相同的机制来传递。

    您需要在列表视图中获取该特定项的URI。由于所有内容都存储在数据库中,因此您应该为这些项目设置不同的uri,并且可以将该uri作为您的额外目的。这不是一个答案,只是一个建议。千万不要建议某人从另一个
    活动
    访问一个
    活动
    中的
    公共静态
    数据成员。请删除您对我的代码进行优化的建议。1。我不完全确定“返回光标”是什么意思,就像我不确定这将如何影响fetchNotes()脚本的其余部分一样。a) 我不知道如何在fetchNotes()中实现listItems的使用。b) 听起来是最好的选择,但我也不知道该如何实现。非常感谢您的回复,如果您能给我一些示例或代码片段,我将不胜感激。(对不起,我是android新手)。@p00pb00b我只是建议不要批评。。。至于游标返回,这是wat,我的意思是公共游标fetchNotes(字符串标题)抛出SQLException{cursor mCursor=mDb.query(表名,新字符串[]{“\u id”,“title”,“note”},null,null,null,null,“\u id”);return mCursor;}@Squonk我想我得到了。。。因为这样数据成员就可以被操纵,你的意思是。。。遵循java或oops的基本规则。。。无论如何,公共静态还是仅删除公共?请给我一些启示,我总是喜欢从我的错误中学习。。。thx@Ahmad:您不应在
    活动
    中的字段(变量)或方法中使用
    公共
    修饰符,以便其他应用程序组件可以访问它们。原因是
    活动
    可以随时销毁。在极少数情况下,基本数据类型(例如int)的
    public static
    可能是可以的,但有更安全的方法,例如使用helper类。决不能对对象使用
    public static
    ,因为无法保证对象已初始化,它可能会导致NullPointerException-它还可能通过防止垃圾收集而导致内存泄漏。我想在用户单击ListView项时将ID从主活动传递到editnote活动。因此,它将传递与他们单击的项目相关的ID。我该如何传递身份证?谢谢你的回复。很抱歉,你能说清楚一件事吗。当前从MainActivity,您正在传递所选项目的标题,但您想传递所选项目的ID吗?正确吗?当我取消注释行-I.putExtra(“ID”,listItems.get(position)),它当前没有传递标题;-并取消对我的EditNote活动中的行的注释-String listItem=getIntent().getStringExtra(“listItem”);-它会导致它在打开EditItem活动时崩溃。好的。您需要重新设计代码以实现这一点。创建一个包含ID、Title和Note的新类,并更改fetchNotes以返回此新类的ArrayList。将refreshData之外的fetchNotes移动到MainActivity中,并将结果存储在成员变量中。将此列表传递给refreshData并适当地填写列表。现在在列表选择中,使用存储的位置和列表获取所选对象,然后将任何字段传递给EditNote。您可能需要编写一个fetchNote方法,该方法采用I
        DatabaseHelper dbh;
        ArrayList<String> listItems = new ArrayList<String>();
        ArrayAdapter<String> adapter;
        Context mCtx;
        ListView lv;
    
    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);
            }
            });
    
    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);
        }
    
    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); ";