为什么游标索引超出范围?

问题描述 投票:0回答:3

我试图在光标的帮助下显示存储在表中的字符串。我从表中拉出一行但是当我执行“getString()”函数时,它会超出范围。

package com.example.mridul.eventmanager;

import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class DetailActivity extends AppCompatActivity {

    DatabaseHelper db = new DatabaseHelper(this);
    TextView textId,textName, textDesc, textVenue, textType;
    ImageView ePic;
    int id;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        textId = (TextView) findViewById(R.id.textView12);
        textName = (TextView) findViewById(R.id.textView13);
        textDesc = (TextView) findViewById(R.id.textView14);
        textVenue = (TextView) findViewById(R.id.textView15);
        textType = (TextView) findViewById(R.id.textView16);

        ePic = (ImageView) findViewById(R.id.imageView2);

        Cursor data = db.getRowDetail(id);

        textId.setText(data.getString(0));
        textName.setText(data.getString(1));
        textDesc.setText(data.getString(2));
        textVenue.setText(data.getString(3));
        textType.setText(data.getString(4));

        ePic.setImageURI(Uri.parse(data.getString(5)));

        Toast.makeText(getApplicationContext(),"columns entered in list", Toast.LENGTH_SHORT).show();







    }
}

游标数据取自DatabaseHelper类,如下所示

public Cursor getRowDetail(int id){

SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT * FROM "+EVENT_TABLE_NAME+" WHERE "+EVENT_ID+" = '"+id+"'";
Cursor data = db.rawQuery(query,null);
return data;

}

id变量取自不同的类。其中一小部分如下。

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long id) {

                String event_name = adapterView.getItemAtPosition(i).toString();
                Cursor data = dp.getEventId(event_name);
                int itemid=-1;
                while(data.moveToNext()){
                    itemid = data.getInt(0);

                }
                if( itemid >0){

                    detailObj.id=itemid;

                    Intent eventDetail = new Intent(LoginActivity.this, DetailActivity.class);
                    LoginActivity.this.startActivity(eventDetail);
                    Toast.makeText(getApplicationContext(), "Item id "+itemid, Toast.LENGTH_SHORT).show();

                }

而我得到的错误是......

 FATAL EXCEPTION: main
                                                                               Process: com.example.mridul.eventmanager, PID: 4520
                                                                               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mridul.eventmanager/com.example.mridul.eventmanager.DetailActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
java android
3个回答
1
投票

在DetailActivity中,Cursor data = db.getRowDetail(id);在此行的id值中未定义。

这里int id;

这可能是一个问题


0
投票

你永远不会打电话给moveToFirst所以你不能检查结果是否为空。所以一定要检查:

if(data.moveToFirst()){
    do{
        itemid = data.getInt(0);
    }while(data.moveToNext());
}

0
投票

我的SQLiteDatabase表中的一个字段为空。要使游标工作,每个字段都需要具有某种数据,否则它将无法用于检索信息。所以我填补了空场,现在全部修好了。

© www.soinside.com 2019 - 2024. All rights reserved.