0

我正在尝试开发一个 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”变量。这不是被传递给类方法来获取名称和年龄吗?

希望有人可以推动我朝着正确的方向前进。

再次

这是我的代码。我的数据库助手类中的 2 种方法从数据库中获取名称和年龄:

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;

列表视图的类,传递 id 变量并启动意图:

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);
4

2 回答 2

2

你能发现你的错误吗?

 i.putExtra("passID", id);
 id = extras.getLong("passedID"); 

Extra-names 存储为常量以消除拼写错误可能是明智之举

于 2013-01-11T23:21:39.913 回答
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
    }
}
于 2013-01-11T23:46:40.810 回答