Search code examples
androidsqliteruntime-errorandroid-notificationsandroid-cursor

i want to fetch the sqlite database then according to the date existing in it i want to create a notification.. but the system display an error


i have an android application that use sqlite database that contain stored data one of them is the date.

sqlite schema

- [_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
 - [stad_name] VARCHAR(50) NOT NULL,
 - [team1] VARCHAR(50) NOT NULL,

  [team2] VARCHAR(50) NOT NULL, 
  [stage] varchar(50) NOT NULL, 
  [match_date] DATETIME NOT NULL, 
  [flags1] CHAR(255), 
  [flags2] CHAR(255), 
  [group_team] CHAR(1));

so what i want is that after i fetching the database i want to create a notification according to that date.. but the system display an error :

logCat

04-29 22:49:32.137: E/AndroidRuntime(2841): Caused by: android.database.CursorIndexOutOfBoundsException: Index 48 requested, with a size of 48
04-29 22:49:32.137: E/AndroidRuntime(2841):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at com.devleb.expandablelistdemo3.FirstActivity.createBasicNotification(FirstActivity.java:201)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at com.devleb.expandablelistdemo3.FirstActivity.showNotification(FirstActivity.java:186)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at com.devleb.expandablelistdemo3.FirstActivity.onCreate(FirstActivity.java:66)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at android.app.Activity.performCreate(Activity.java:5133)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-29 22:49:32.137: E/AndroidRuntime(2841):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
04-29 22:49:32.137: E/AndroidRuntime(2841):     ... 11 more

how to fix this error and what i am doing wrong ??

FirstActivity.java

package com.devleb.expandablelistdemo3;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class FirstActivity extends Activity {

    private SQLiteDatabase database;
    private ExternalDbOpenHelper extDB;

    private static final String DB_NAME = "world_cup.db";
    // *****Tables name**************************//
    private static final String TABLE_NAME = "match_list";

    // *****Tbale name******************************

    public static final String PLACE_ID = "_id";
    public static final String STAD_NAME = "stad_name";
    public static final String TEAM1 = "team1";
    public static final String TEAM2 = "team2";
    public static final String MATCH_DATE = "match_date";
    public static final String FLAG1 = "flags1";
    public static final String FLAG2 = "flags2";

    public static final String[] ALL_KEYS = new String[] { PLACE_ID, STAD_NAME,
            TEAM1, TEAM2, MATCH_DATE, FLAG1, FLAG2, };
    // *****Tbale name******************************

    ItemDetails listdetail;

    Cursor c;

    private static final int myNotificationId = 1;

    // private DatabaseHelper dbHelper = null;

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

        extDB = new ExternalDbOpenHelper(this, DB_NAME);
        database = extDB.openDataBase();

        showNotification();
    }

    public void listTeams(View v) {
        Intent in = new Intent(getBaseContext(), MainActivity.class);
        startActivity(in);
    }

    public void listGroups(View v) {
        Intent in = new Intent(getBaseContext(), GroupList.class);
        startActivity(in);
    }

    public void DisplaySched(View v) {

        Intent in = new Intent(getBaseContext(), MatchScheduleList.class);
        startActivity(in);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.first, menu);
        return true;
    }

    public void getDiffDate() {

        String dateStop = "06/12/2014 23:00:00";

        // HH converts hour in 24 hours format (0-23), day calculation
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

        Date d1 = new Date();

        Date d2 = null;

        try {

            d2 = format.parse(dateStop);

            // in milliseconds
            long diff = d2.getTime() - d1.getTime();

            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);

            System.out.print(diffDays + " days, ");
            System.out.print(diffHours + " hours, ");
            System.out.print(diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");

            TextView txtDate = (TextView) findViewById(R.id.txtDifDate);
            String resultDate = diffDays + "days " + diffHours + "Hours "
                    + diffMinutes + "Min " + diffSeconds + "S";
            txtDate.setText(resultDate);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public Cursor getAllRows() {
        String where = null;

        c = database.query(true, TABLE_NAME, ALL_KEYS, where, null, null, null,
                null, null);
        if (c != null) {

            c.moveToFirst();

            while (!c.isAfterLast()) {
                listdetail = new ItemDetails();

                listdetail.setTeam1(c.getString(c.getColumnIndex("team1")));

                listdetail.setTeam2(c.getString(c.getColumnIndex("team2")));

                listdetail.setDate_match(c.getString(c
                        .getColumnIndex("match_date")));

                listdetail.setFlag1(c.getString(c.getColumnIndex("flags1")));

                listdetail.setFlag2(c.getString(c.getColumnIndex("flags2")));

                c.moveToNext();

            }

        }
        return c;

    }





    // for the notification


    private PendingIntent preparePendingIntent() {
        Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

        PendingIntent pendingIntent = PendingIntent.getActivity(
                getApplicationContext(), 
                0, 
                intent, 
                PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;
    }

    private void showNotification() {
        PendingIntent notificationIntent = preparePendingIntent();
        Notification notification = createBasicNotification(notificationIntent);
        displayNotification(notification);
    }


    private Notification createBasicNotification(PendingIntent notificationIntent) {
        Cursor cursor = getAllRows();


        NotificationCompat.Builder builder = new Builder(
                getApplicationContext());
        Notification notification = builder
                .setSmallIcon(R.drawable.fifa_2014_4)
                .setContentTitle("Up Comming Match")
                .setContentText(
                        c.getString(c.getColumnIndex("match_date"))
                                + (c.getColumnIndex("team1"))
                                + (c.getColumnIndex("team2"))
                                + (c.getColumnIndex("flags1"))
                                + (c.getColumnIndex("flags2"))).build();


        return notification;

    }

    private void displayNotification(Notification notification) {
        NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(myNotificationId , notification);
    }

}

Solution

  • After iterating through the whole cursor with getAllRows()

    you try to get one more element:

    c.getString(c.getColumnIndex("match_date"))
                                    + (c.getColumnIndex("team1"))
                                    + (c.getColumnIndex("team2"))
                                    + (c.getColumnIndex("flags1"))
                                    + (c.getColumnIndex("flags2"))).build();
    

    This won't work. You will have to remove these lines.

    try following:

    import android.app.Activity;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.support.v4.app.NotificationCompat;
    import android.support.v4.app.NotificationCompat.Builder;
    import android.view.Menu;
    import android.view.View;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Locale;
    
    import de.gelbeseiten.androidapp.activities.MainActivity;
    
    public class FirstActivity extends Activity {
    
        private SQLiteDatabase database;
        private ExternalDbOpenHelper extDB;
    
        private static final String DB_NAME = "world_cup.db";
        // *****Tables name**************************//
        private static final String TABLE_NAME = "match_list";
    
        // *****Tbale name******************************
    
        public static final String PLACE_ID = "_id";
        public static final String STAD_NAME = "stad_name";
        public static final String TEAM1 = "team1";
        public static final String TEAM2 = "team2";
        public static final String MATCH_DATE = "match_date";
        public static final String FLAG1 = "flags1";
        public static final String FLAG2 = "flags2";
    
        public static final String[] ALL_KEYS = new String[] { PLACE_ID, STAD_NAME,
                TEAM1, TEAM2, MATCH_DATE, FLAG1, FLAG2, };
        // *****Tbale name******************************
    
        ItemDetails listdetail;
    
        Cursor c;
    
        private static final int myNotificationId = 1;
    
        // private DatabaseHelper dbHelper = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_first);
            getDiffDate();
    
            extDB = new ExternalDbOpenHelper(this, DB_NAME);
            database = extDB.openDataBase();
    
            showNotification();
        }
    
        public void listTeams(View v) {
            Intent in = new Intent(getBaseContext(), MainActivity.class);
            startActivity(in);
        }
    
        public void listGroups(View v) {
            Intent in = new Intent(getBaseContext(), GroupList.class);
            startActivity(in);
        }
    
        public void DisplaySched(View v) {
    
            Intent in = new Intent(getBaseContext(), MatchScheduleList.class);
            startActivity(in);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.first, menu);
            return true;
        }
    
        public boolean isTomorrow(Date d1) {
    
          GregorianCalendar tomorrow = new GregorianCalendar();
            tomorrow.add(Calendar.DATE, 1);
            return (d1.before(tomorrow.getTime()));
    
        }
    
        public Cursor getAllRows(PendingIntent notificationIntent){
            String where = null;
    
            c = database.query(true, TABLE_NAME, ALL_KEYS, where, null, null, null,
                    null, null);
            if (c != null) {
    
                c.moveToFirst();
    
                while (!c.isAfterLast()) {
                    listdetail = new ItemDetails();
    
                    listdetail.setTeam1(c.getString(c.getColumnIndex("team1")));
    
                    listdetail.setTeam2(c.getString(c.getColumnIndex("team2")));
    
                    listdetail.setDate_match(c.getString(c
                            .getColumnIndex("match_date")));
    
                    listdetail.setFlag1(c.getString(c.getColumnIndex("flags1")));
    
                    listdetail.setFlag2(c.getString(c.getColumnIndex("flags2")));
    
                    Calendar t = new GregorianCalendar();
                    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YYYY", Locale.getDefault());
                    Date dt = null;
                    try {
                        dt = sdf.parse(c.getString(c.getColumnIndex("match_Date")));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
    
                    if(isTomorrow(dt)){
                        NotificationCompat.Builder builder = new Builder(
                                getApplicationContext());
                        Notification notification = builder
                                .setSmallIcon(R.drawable.fifa_2014_4)
                                .setContentTitle("Up Comming Match")
                                .setContentText(
                                        c.getString(c.getColumnIndex("match_date"))
                                                + (c.getColumnIndex("team1"))
                                                + (c.getColumnIndex("team2"))
                                                + (c.getColumnIndex("flags1"))
                                                + (c.getColumnIndex("flags2"))
                                ).build();
    
                        displayNotification(notification);
                    }
                    c.moveToNext();
    
                }
    
            }
            return c;
    
        }
    
    
    
    
    
        // for the notification
    
    
        private PendingIntent preparePendingIntent() {
            Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
            PendingIntent pendingIntent = PendingIntent.getActivity(
                    getApplicationContext(), 
                    0, 
                    intent, 
                    PendingIntent.FLAG_UPDATE_CURRENT);
            return pendingIntent;
        }
    
        private void showNotification() {
            PendingIntent notificationIntent = preparePendingIntent();
            getAllRows(notificationIntent);
    
        }
    
    
    
        private void displayNotification(Notification notification) {
            NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(myNotificationId , notification);
        }
    
    }