简体   繁体   中英

Using a cursor to return rows from SQLite, error when database is empty

When my database is empty, or it has just been created I am getting this error,

03-10 17:34:40.758: E/AndroidRuntime(1144): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.adressbooktake2/com.example.adressbooktake2.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

Here is my code in my main class,

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

}

which then calls this code in my DBAdaptor class,

    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;

    }

}

I believe the problem is that when the database has just been created, there is nowhere for the moveToFirst() to go, as there is no data. But I am not sure how to get round this as I need a moveToFirst() for when there is a stocked database.

Anyone see a solution? Have a diagnosed the problem correctly?

You can check for an empty Cursor like this:

...
cursor = db.getAllRecords();
if(cursor.getCount() > 0)
    DisplayRecords(cursor);
else
    DisplayNoRecordsMessage();

Or since you posted DisplayRecords() in a previous question, you can also use:

...
if (c != null && !cursor.isAfterLast())
{
    nameTxt.setText(c.getString(1));
    phoneTxt.setText(c.getString(2));
    emailTxt.setText(c.getString(3));
}

Also please read about Java naming convention which states that method names should start with a lowercase letter.

Cursor.moveToFirst() returns false in case of empty cursor.

See the doc: http://developer.android.com/reference/android/database/Cursor.html#moveToFirst()

I'd say the problem is in DisplayRecord().

Are you fetching data from the cursor in DisplayRecord() ? If so, inside of it you should check if the cursor contains some data, calling moveToFirst and checking its result for example.

Something like

private void DisplayRecord(Cursor c){
    if(!c.moveToFirst()){
         return;
    }
    // do stuff
}

Use if(cursor .moveToFirst()) to check cursor

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


}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM