空游标返回

时间:2013-01-11 23:16:32

标签: java android

我试图开发一个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);

2 个答案:

答案 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
    }
}