i have an android application that use sqlite database that contain stored data one of them is the date.
- [_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 :
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 ??
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);
}
}
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);
}
}