Navdeep
Navdeep

Reputation: 147

how to solve android.database.CursorIndexOutOfBoundException Index 0 requested,with a size of 0

CalendarView.java


import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Locale;
import android.app.Activity;
import android.database.Cursor;    
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class CalendarView extends Activity {
    DatabaseHandler db;

    TextView t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
    public GregorianCalendar month, itemmonth;// calendar instances.

    public CalendarAdapter adapter;// adapter instance
    public Handler handler;// for grabbing some event values for showing the dot
                            // marker.
    public ArrayList<String> items; // container to store calendar items which
    String selectedGridDate;                                // needs showing the event marker

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calendar);

        t1 = (TextView) findViewById(R.id.textv1);
        t2 = (TextView) findViewById(R.id.textv2);
        t3 = (TextView) findViewById(R.id.textv3);
        t4 = (TextView) findViewById(R.id.textv4);
        t5 = (TextView) findViewById(R.id.textv5);
        t6 = (TextView) findViewById(R.id.textv6);
        t7 = (TextView) findViewById(R.id.textv7);
        t8 = (TextView) findViewById(R.id.textv8);
        t9 = (TextView) findViewById(R.id.textv9);
        t10 = (TextView) findViewById(R.id.textv10);

        db = new DatabaseHandler(this);
    enter code here
        Locale.setDefault(Locale.US);
        month = (GregorianCalendar) GregorianCalendar.getInstance();
        itemmonth = (GregorianCalendar) month.clone();

        items = new ArrayList<String>();
        adapter = new CalendarAdapter(this, month);

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(adapter);

        handler = new Handler();
        handler.post(calendarUpdater);

        TextView title = (TextView) findViewById(R.id.title);
        title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));

        RelativeLayout previous = (RelativeLayout) findViewById(R.id.previous);

        previous.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                setPreviousMonth();
                refreshCalendar();
            }
        });

        RelativeLayout next = (RelativeLayout) findViewById(R.id.next);
        next.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                setNextMonth();
                refreshCalendar();

            }
        });

        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {

                ((CalendarAdapter) parent.getAdapter()).setSelected(v);
                 selectedGridDate = CalendarAdapter.dayString
                        .get(position);
                String[] separatedTime = selectedGridDate.split("-");
                String gridvalueString = separatedTime[2].replaceFirst("^0*",
                        "");// taking last part of date. ie; 2 from 2012-12-02.
                int gridvalue = Integer.parseInt(gridvalueString);
                // navigate to next or previous month on clicking offdays.
                if ((gridvalue > 10) && (position < 8)) {
                    setPreviousMonth();
                    refreshCalendar();
                } else if ((gridvalue < 7) && (position > 28)) {
                    setNextMonth();
                    refreshCalendar();
                }
                ((CalendarAdapter) parent.getAdapter()).setSelected(v);
                Log.e("selectedGridDate..", ""+selectedGridDate);
                showToast(selectedGridDate);

                Contact con=db.getContact(selectedGridDate);
                Log.e("con", ""+con);
                String log1 = con.getC1NAME();
                Log.e("log1", log1);
                t1.setText(log1);
                String log2 = con.getC1NAME();
                Log.e("log2", log2);
                t2.setText(log2);
                String log3 = con.getC1NAME();
                t3.setText(log3);
                String log4 = con.getC1NAME();
                t4.setText(log4);
                String log5 = con.getC1NAME();
                t5.setText(log5);
                String log6 = con.getC1NAME();
                t6.setText(log6);
                String log7 = con.getC1NAME();
                t7.setText(log7);
                String log8 = con.getC1NAME();
                t8.setText(log8);
                String log9 = con.getC1NAME();
                t9.setText(log9);
                String log10 = con.getC1NAME();
                t10.setText(log10);
            }
        });


    }

    protected void setNextMonth() {
        if (month.get(GregorianCalendar.MONTH) == month
                .getActualMaximum(GregorianCalendar.MONTH)) {
            month.set((month.get(GregorianCalendar.YEAR) + 1),
                    month.getActualMinimum(GregorianCalendar.MONTH), 1);
        } else {
            month.set(GregorianCalendar.MONTH,
                    month.get(GregorianCalendar.MONTH) + 1);
        }

    }

    protected void setPreviousMonth() {
        if (month.get(GregorianCalendar.MONTH) == month
                .getActualMinimum(GregorianCalendar.MONTH)) {
            month.set((month.get(GregorianCalendar.YEAR) - 1),
                    month.getActualMaximum(GregorianCalendar.MONTH), 1);
        } else {
            month.set(GregorianCalendar.MONTH,
                    month.get(GregorianCalendar.MONTH) - 1);
        }

    }

    protected void showToast(String string) {
        Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
    }

    public void refreshCalendar() {
        TextView title = (TextView) findViewById(R.id.title);

        adapter.refreshDays();
        adapter.notifyDataSetChanged();
        handler.post(calendarUpdater); // generate some calendar items

        title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
    }

    public Runnable calendarUpdater = new Runnable() {

        public void run() {
            items.clear();

            // Print dates of the current week
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);

            for (int i = 0; i < 7; i++) {
                String itemvalue;
                itemvalue = df.format(itemmonth.getTime());
                itemmonth.add(GregorianCalendar.DATE, 1);
                items.add("2012-09-12");
                items.add("2012-10-07");
                items.add("2012-10-15");
                items.add("2012-10-20");
                items.add("2012-11-30");
                items.add("2012-11-28");
            }

            adapter.setItems(items);
            adapter.notifyDataSetChanged();
        }
    };

}




My Database is....


import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHandler extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "contactsManager.db";
    public static final String TABLE_NAME = "contacts";

    public static final String KEY_DT = "date";
    public static final String KEY_C1 = "c1";
    public static final String KEY_C2 = "c2";
    public static final String KEY_C3 = "c3";
    public static final String KEY_C4 = "c4";
    public static final String KEY_C5 = "c5";
    public static final String KEY_C6 = "c6";
    public static final String KEY_C7 = "c7";
    public static final String KEY_C8 = "c8";
    public static final String KEY_C9 = "c9";
    public static final String KEY_C10 = "c10";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String Create_Table = "CREATE TABLE " + TABLE_NAME + "(" + KEY_DT
                + " TEXT, " + KEY_C1 + " TEXT, " + KEY_C2 + " TEXT, " + KEY_C3
                + " TEXT, " + KEY_C4 + " TEXT, " + KEY_C5 + " TEXT, " + KEY_C6
                + " TEXT, " + KEY_C7 + " TEXT, " + KEY_C8 + " TEXT, " + KEY_C9
                + " TEXT, " + KEY_C10 + " TEXT " + ")";
        db.execSQL(Create_Table);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
        onCreate(db);
    }

    public void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(KEY_C1, contact.getC1NAME());
        cv.put(KEY_C2, contact.getC2NAME());
        cv.put(KEY_C3, contact.getC3NAME());
        cv.put(KEY_C4, contact.getC4NAME());
        cv.put(KEY_C5, contact.getC5NAME());
        cv.put(KEY_C6, contact.getC6NAME());
        cv.put(KEY_C7, contact.getC7NAME());
        cv.put(KEY_C8, contact.getC8NAME());
        cv.put(KEY_C9, contact.getC9NAME());
        cv.put(KEY_C10, contact.getC10NAME());
        db.insert(TABLE_NAME, null, cv);
        db.close();
    }

    public Contact getContact(String _date) {
        Log.e("_date", "" + _date);
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_NAME, new String[] { KEY_DT, KEY_C1,
                KEY_C2, KEY_C3, KEY_C4, KEY_C5, KEY_C6, KEY_C7, KEY_C8, KEY_C9,
                KEY_C10 }, KEY_DT + "='" + _date + "'", null, null, null, null);

        /*Cursor cursor = db.query(TABLE_NAME, new String[] { KEY_DT, KEY_C1,
                KEY_C2, KEY_C3, KEY_C4, KEY_C5, KEY_C6, KEY_C7, KEY_C8, KEY_C9,
                KEY_C10 }, KEY_DT + "=?", new String[] { _date }, null, null,
                null, null);*/
        Log.e("cursor", cursor.getCount() + "");
        if (cursor != null)
            Log.e("cursor", cursor + "");
        Log.e("cursor1", cursor.moveToFirst() + "");

        cursor.moveToFirst();
        Log.e("cursor2", cursor.moveToFirst() + "");

        Contact contact = new Contact(cursor.getString(0), cursor.getString(1),
                cursor.getString(2), cursor.getString(3), cursor.getString(4),
                cursor.getString(5), cursor.getString(6), cursor.getString(7),
                cursor.getString(8), cursor.getString(9), cursor.getString(10));
        db.close();
        return contact;
    }

    public List<Contact> getAllContacts() {
        List<Contact> contactList = new ArrayList<Contact>();

        String selectQuery = "SELECT  * FROM " + TABLE_NAME;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()) {
            do {
                Contact contact = new Contact();
                contact.setDATE(cursor.getString(0));
                contact.setC1NAME(cursor.getString(1));
                contact.setC2NAME(cursor.getString(2));
                contact.setC3NAME(cursor.getString(3));
                contact.setC4NAME(cursor.getString(4));
                contact.setC5NAME(cursor.getString(5));
                contact.setC6NAME(cursor.getString(6));
                contact.setC7NAME(cursor.getString(7));
                contact.setC8NAME(cursor.getString(8));
                contact.setC9NAME(cursor.getString(9));
                contact.setC10NAME(cursor.getString(10));

                contactList.add(contact);
            } while (cursor.moveToNext());
        }

        db.close();
        return contactList;
    }

    public int updateContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_C1, contact.getC1NAME());
        values.put(KEY_C2, contact.getC2NAME());
        values.put(KEY_C3, contact.getC3NAME());
        values.put(KEY_C4, contact.getC4NAME());
        values.put(KEY_C5, contact.getC5NAME());
        values.put(KEY_C6, contact.getC6NAME());
        values.put(KEY_C7, contact.getC7NAME());
        values.put(KEY_C8, contact.getC8NAME());
        values.put(KEY_C9, contact.getC9NAME());
        values.put(KEY_C10, contact.getC10NAME());

        return db.update(TABLE_NAME, values, KEY_DT + " = ?",
                new String[] { contact.getDATE() });
    }

    public void deleteContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, KEY_DT + " = ?",
                new String[] { contact.getDATE() });
        db.close();
    }

    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        db.close();
        return cursor.getCount();
    }
}

I want to get all items of row(date,c1,c2,c3,.......,c10) on each date click but there is cursor null exception .i.e. database does not have any record .I have inserted contactsManager.db in asset folder . When i check contactsManager.db in file explorer data/data/...and i open this file in sqlitedatabase browser ,this shows empty database .

My Logcat is

 06-18 18:09:05.746: D/dalvikvm(29525): GC_EXTERNAL_ALLOC freed 51K, 53% free 2554K/5379K, external 1625K/2137K, paused 54ms
    06-18 18:09:08.436: D/dalvikvm(29525): GC_EXTERNAL_ALLOC freed 8K, 53% free 2575K/5379K, external 4209K/5256K, paused 111ms
    06-18 18:09:12.197: E/selectedGridDate..(29525): 2013-06-12
    06-18 18:09:12.326: E/con(29525): android.database.sqlite.SQLiteCursor@40564040
    06-18 18:09:12.326: E/con...(29525): false
    06-18 18:09:12.326: E/first(29525): first
    06-18 18:09:12.336: E/first1(29525): first1
    06-18 18:09:12.350: E/hellllllll(29525): hello
    06-18 18:09:12.350: D/AndroidRuntime(29525): Shutting down VM
    06-18 18:09:12.356: W/dalvikvm(29525): threadid=1: thread exiting with uncaught exception (group=0x40015560)
    06-18 18:09:12.386: E/AndroidRuntime(29525): FATAL EXCEPTION: main
    06-18 18:09:12.386: E/AndroidRuntime(29525): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at com.para.digital.technologies.panchang2013.CalendarView$4.onItemClick(CalendarView.java:122)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.os.Handler.handleCallback(Handler.java:587)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.os.Handler.dispatchMessage(Handler.java:92)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.os.Looper.loop(Looper.java:123)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at android.app.ActivityThread.main(ActivityThread.java:3683)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at java.lang.reflect.Method.invokeNative(Native Method)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at java.lang.reflect.Method.invoke(Method.java:507)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    06-18 18:09:12.386: E/AndroidRuntime(29525):    at dalvik.system.NativeStart.main(Native Method)
    06-18 18:14:12.459: I/Process(29525): Sending signal. PID: 29525 SIG: 9

     i want to get single row items,but it gives cursor is 0/empty .i do not understand, what should do i .
    i am new for android developer ,please help me
    THANKS in Advance....

Upvotes: 0

Views: 479

Answers (1)

waqaslam
waqaslam

Reputation: 68177

Seems like you are trying to read a Cursor which is empty. Try returning it as below:

if (cursor.moveToFirst())
    return cursor;
else
    return null;

Upvotes: 2

Related Questions