0

ユーザーがリストメニューからアイテムを選択するAndroidプログラムを開発しようとしています...次に、このアイテムのIDを2番目のクラスのインテントに渡します。IDは変数に保存され、に入力されます人の名前と年齢を取得し、このデータを XML の関連する EditText に表示する DBhelper メソッド。

2 番目のインテントを開始しようとするまで、すべて正常に動作します。次のエラーが表示されます:

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;

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*()操作の結果のいずれかを確認することをお勧めします。

1 行のみが予想される場合 (一意の 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 に答える