Java 使用游标从SQLite返回行,数据库为空时出错

Java 使用游标从SQLite返回行,数据库为空时出错,java,android,sqlite,Java,Android,Sqlite,当我的数据库是空的,或者它刚刚被创建时,我得到了这个错误 03-1017:34:40.758:E/AndroidRuntime(1144): java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.addressbooktake2/com.example.addressbooktake2.MainActivity}: android.database.CursorIndexOutOfBoundsException:请求索引0,大小为

当我的数据库是空的,或者它刚刚被创建时,我得到了这个错误

03-1017:34:40.758:E/AndroidRuntime(1144): java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.addressbooktake2/com.example.addressbooktake2.MainActivity}: android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0

这是我在主课上的代码

public class MainActivity extends Activity {
    DBAdaptor db;   
    Cursor cursor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        db = new DBAdaptor(this).open();        
        cursor = db.getAllRecords();

        DisplayRecord(cursor);

}
然后在我的DBAdaptor类中调用此代码

    public Cursor getAllRecords() 

    {       
        Cursor gaRecords = db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
                        KEY_PHONENUMBER, KEY_EMAIL}, null, null, null, null, null);     


        gaRecords.moveToFirst();

        return gaRecords;

    }

}
我认为问题在于,当数据库刚刚创建时,moveToFirst()就没有地方可去了,因为没有数据。但我不知道如何解决这个问题,因为当有库存数据库时,我需要一个moveToFirst()


有人看到解决办法了吗?是否正确诊断了问题?

您可以检查是否有空光标,如下所示:

...
cursor = db.getAllRecords();
if(cursor.getCount() > 0)
    DisplayRecords(cursor);
else
    DisplayNoRecordsMessage();
或者,由于您在前面的问题中发布了
DisplayRecords()
,您还可以使用:

...
if (c != null && !cursor.isAfterLast())
{
    nameTxt.setText(c.getString(1));
    phoneTxt.setText(c.getString(2));
    emailTxt.setText(c.getString(3));
}
另外,请阅读哪些状态下方法名称应以小写字母开头。

游标。如果游标为空,moveToFirst()将返回false

见文件:

我认为问题出在DisplayRecord()中

是否从DisplayRecord()中的光标提取数据?如果是这样,您应该在其中检查光标是否包含一些数据,例如调用moveToFirst并检查其结果

差不多

private void DisplayRecord(Cursor c){
    if(!c.moveToFirst()){
         return;
    }
    // do stuff
}
使用if(cursor.moveToFirst())检查光标

public class MainActivity extends Activity {
    DBAdaptor db;   
    Cursor cursor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        db = new DBAdaptor(this).open();        
        cursor = db.getAllRecords();

        if(cursor.moveToFirst()){
           DisplayRecord(cursor);
            }


}

那就对了!但我真的不明白为什么。是否因为它仅在大于0时传递光标?当它为0时会发生什么?是不是忘记了?@user2153547确切地说,当
getCount()==0
你的代码不会调用
DisplayRecords()
,当有行时,它们会一行一行地显示出来。@ρρєK作者一次只想显示一条记录,我从前面的问题知道这一点。:)(这就是为什么我没有使用
moveToFirst()