我试图开发一个Android程序,让用户从列表菜单中选择一个项目......然后将该项目的ID传递给第二个类的意图,然后将该ID存储在变量中,输入到DBhelper方法中以获取人员的姓名和年龄,并在XML的相关EditTexts中显示这些数据。
一切正常,直到我尝试开始第二个意图。我得到一个错误:
01-11 22:21:28.448: E/AndroidRuntime(274): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sqliteexample/com.example.sqliteexample.DisplayContents}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
请注意,我已初始化了以'0'传递的'id'变量。这是不是传递给类方法来获取名称和年龄?
希望有人可以帮我推动正确的方向。
再次
这是我的代码。我的DB帮助程序类中的2方法从DB获取名称和年龄:
public String showData(long id) {
String [] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_HOTNESS};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + id, null, null, null, null);
if(c != null)
{
// move to the selected row
c.moveToFirst();
String namePass = c.getString(1);
return namePass;
}
return null;
}
public String showAge(long id) {
String [] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_HOTNESS};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + id, null, null, null, null);
if(c != null)
{
// move to the selected row
c.moveToFirst();
String agePass = c.getString(2);
return agePass;
}
return null;
listview的类,传递id变量并启动intent:
public void onListItemClick(ListView list, View v, int list_posistion, long item_id)
{
long id = item_id;
Intent i = new Intent("com.example.sqliteexample.DisplayContents");
i.putExtra("passID", id);
startActivity(i);
}
从意图打开的最后一个类,并在onCreate上显示名称和年龄:
package com.example.sqliteexample;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.content.Intent;
public class DisplayContents extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.displaycontents);
long id = 0;
EditText namePassed;
EditText agePassed;
namePassed = (EditText) findViewById(R.id.nameShow);
agePassed = (EditText) findViewById(R.id.ageShow);
HotOrNot display = new HotOrNot(this, null, null);
Bundle extras = getIntent().getExtras();
if (extras != null) {
id = extras.getLong("passedID");
}
display.open();
String returnedName = display.showData(id);
String returnedAge = display.showAge(id);
namePassed.setText(returnedName);
agePassed.setText(returnedAge);
答案 0 :(得分:2)
你能发现你的错误吗?
i.putExtra("passID", id);
id = extras.getLong("passedID");
将Extra
- 名称存储为常量来消除拼写错误
答案 1 :(得分:1)
除了@Ole关于附加内容的评论之外,如果您获得空Cursor
,您可能会发现您接触到边界异常(即,一个零行 - 你得到的,因为你的ID不正确。)
为了防止这种情况,最好检查A)光标中的行数,或B)任何.move*()
操作的结果。
如果您只预测一行(例如从唯一ID中查找),那么以下内容就足够了:
Cursor c = someDatabase.query(...);
if (c != null && c.moveToFirst()) { // null check (if error), and valid row check
// Your row operation
}
否则,对于多行,您将需要另一种方法(有很多,这是一个非常简单的方法):
Cursor c = someDatabase.query(...);
if (c != null) { // Will hit if there is an error
if (c.moveToFirst()) { // If we have rows
do {
// Your row operation
} while (c.moveToNext()); // Step into next row
}
}