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

时间:2013-03-10 17:43:37

标签: java android sqlite

当我的数据库为空或刚刚创建时,我收到此错误,

  

03-10 17:34:40.758:E / AndroidRuntime(1144):   java.lang.RuntimeException:无法启动活动   ComponentInfo {com.example.adressbooktake2 / com.example.adressbooktake2.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()来存放一个库存数据库。

有人看到解决方案吗?是否正确诊断出问题?

3 个答案:

答案 0 :(得分:1)

你可以像这样检查一个空的光标:

...
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));
}

另请阅读Java naming convention,其中指出方法名称应以小写字母开头。

答案 1 :(得分:0)

Cursor.moveToFirst()在空光标的情况下返回false。

请参阅文档:http://developer.android.com/reference/android/database/Cursor.html#moveToFirst()

我说问题出在DisplayRecord()。

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

这样的东西
private void DisplayRecord(Cursor c){
    if(!c.moveToFirst()){
         return;
    }
    // do stuff
}

答案 2 :(得分:0)

使用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);
            }


}