Android-使用.putExtra将ID从SQLite传递到新活动中
我正在android eclipse中编写一个笔记应用程序。我的应用程序当前从SQLite数据库中选择所有注释,并使用它们填充ListView。此ListView可单击,并且当前将用户重定向到EditNote活动 但是,我希望能够根据单击的ListView注释的ID在EditNote活动中填充EditText (因此,如果我单击了第一个ListView项,其ID为2,则值2将传递给EditNote) 这需要获取单击的ListView项的ID,然后使用.putExtra()将其传递给用户;转到EditNote活动 因此,我的问题是:如何获取ID并将其传递给EditNote活动?这样我就可以使用该ID对该活动进行额外的查询 非常感谢您抽出时间。 我将尽我所能回答任何其他问题 初始化事物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
我会尽力帮助你,我也认为你的代码可以更优化
listItems.add(title)代码>
a。因此,您可以直接在fetchNotes()中使用listItems,如MainActivity.listItems
(假设listItem在MainActivity类中声明)在声明ArrayList listItems=new ArrayList()后使用代码>作为公共静态ArrayList listItems=new ArrayList()代码>
或
b。您只需返回游标,并执行与listItems上myArray类型的操作完全相同的操作
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); ";