Проблема при получении данных из БД
Помогите, пожалуйста, выходит такая ошибка: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.beecalc/com.example.beecalc.OpenDate}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1.
Так же при создании новой записи (AddDate) 2я запись появляется в RecyclerView, но все предыдущие становятся идентичными последней.
OpenDate:
public class OpenDate extends AppCompatActivity {
int noti;
private AppBarConfiguration appBarConfiguration;
private ActivityOpenDateBinding binding;
public static final int[] NOTIF_DATE = new int[]{6,14,28};
SQLiteDatabase s;
TextView[] tv1;
TextView[] tv3;
TextView tv2;
TextView tv4;
TextView tv5;
int[] d1;
int[] d3;
int d2;
int d4;
int d5;
String date0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Intent intent = getIntent();
final int bd_id = intent.getExtras().getInt("id");
DBManage db = new DBManage(this);
s = db.getWritableDatabase();
Cursor cur = s.query(
DBManage.DB_NAME, // таблица
new String[]{DBManage.C_NAME, DBManage.C_PORODA,DBManage.C_NOTIF,DBManage.DB_COLOR,DBManage.DB_DATE},
"_id="+bd_id,
null,
null,
null,
null);
TextView tv_name = findViewById(R.id.tv_name0);
TextView por = findViewById(R.id.tv_por);
final TextView color = findViewById(R.id.tv_color);
TextView date = findViewById(R.id.date0);
tv_name.setText(cur.getString(cur.getColumnIndex(DBManage.C_NAME))); //ошибка ссылается на эту строку
por.setText(cur.getString(cur.getColumnIndex(DBManage.C_PORODA)));
color.setText(cur.getString(cur.getColumnIndex(DBManage.DB_COLOR)));
date0 =cur.getString(cur.getColumnIndex(DBManage.DB_DATE));
date.setText(date0);
tv1 = new TextView[]{
findViewById(R.id.date1),
findViewById(R.id.date2),
findViewById(R.id.date3),
findViewById(R.id.date4),
findViewById(R.id.date5),
findViewById(R.id.date6),
findViewById(R.id.date7),
findViewById(R.id.date8),
findViewById(R.id.date9),
findViewById(R.id.date11)
};
tv3 = new TextView[]{
findViewById(R.id.date14),
findViewById(R.id.date15),
findViewById(R.id.date16),
};
tv2 = findViewById(R.id.date12);
tv4 = findViewById(R.id.date10);
tv5 = findViewById(R.id.date13);
//
d1 = new int[]{1,2,3,4,5,6,7,8,9,11};
d3 = new int[]{22,25,28}; //+2
d2 = 15; //+1
d4 = 10; //+3
d5 = 17; //+4
CheckBox notif = findViewById(R.id.cb_notif);
noti = cur.getInt(cur.getColumnIndex(DBManage.C_NOTIF));
if (noti ==1) {
notif.setActivated(true);
}
//Cтатус уведомлений
notif.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked){
noti=1;
ContentValues cv = new ContentValues();
cv.put(DBManage.C_NOTIF, noti);
s.update(DBManage.C_NOTIF,
cv,
"ID = ?",new String[]{""+bd_id});
Toast.makeText(OpenDate.this, "Вам придут уведомления в даты, отмеченные жирным шрифтом.", Toast.LENGTH_LONG).show();
} else{
noti=0;
ContentValues cv = new ContentValues();
cv.put(DBManage.C_NOTIF, noti);
s.update(DBManage.C_NOTIF,
cv,
"ID = ?",new String[]{""+bd_id});
}
});
binding = ActivityOpenDateBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
ImageButton del = findViewById(R.id.ib_del);
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder dlg = new AlertDialog.Builder(OpenDate.this);
dlg.setMessage("Вы уверены, что хотите удалить запись?")
.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("Удалить", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dele(bd_id);
}
})
.create();
dlg.show();
}
});
}
private void dele(int id) {
s.delete(DBManage.DB_NAME, "_id = '"+id+"'", null);
Toast.makeText(OpenDate.this, "Запись успешно удалена.", Toast.LENGTH_SHORT).show();
Intent i = new Intent(OpenDate.this, MainActivity.class);
startActivity(i);
finish();
}
protected void onDestroy() {
super.onDestroy();
Intent i = new Intent(OpenDate.this, MainActivity.class);
startActivity(i);
finish();
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void fill_tv(){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
LocalDate localDate = LocalDate.parse(date0, formatter);
for (int i=0; i<d1.length;i++){
LocalDate incrementedDate = localDate.plusDays(d1[i]);
tv1[i].setText(incrementedDate.format(formatter));
}
for (int i=0; i<d3.length;i++){
LocalDate iDate = localDate.plusDays(d3[i]);
LocalDate iDatee = localDate.plusDays(d3[i]+2);
tv3[i].setText(iDate.format(formatter)+" - "+iDatee.format(formatter));
}
LocalDate iDate = localDate.plusDays(d4);
LocalDate iDatee = localDate.plusDays(d4+3);
tv4.setText(iDate.format(formatter)+" - "+iDatee.format(formatter));
iDate = localDate.plusDays(d5);
iDatee = localDate.plusDays(d5+3);
tv5.setText(iDate.format(formatter)+" - "+iDatee.format(formatter));
iDate = localDate.plusDays(d2);
iDatee = localDate.plusDays(d2+1);
tv2.setText(iDate.format(formatter)+" - "+iDatee.format(formatter));
}
DBManage:
public class DBManage extends SQLiteOpenHelper {
public static final String DB_NAME = "dates";
public static String C_NAME = "house";
public static String C_PORODA = "poroda";
public static String C_NOTIF = "notif";
public static String DB_COLOR = "color";
public static String DB_DATE = "date";
public DBManage(Context context) {
super(context, "dates", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + DB_NAME + "("
+ "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ C_NAME + " TEXT NOT NULL, "
+ C_NOTIF + " INTEGER NOT NULL DEFAULT 0 , "
+ DB_COLOR + " TEXT NOT NULL, "
+ DB_DATE + " TEXT NOT NULL,"
+ C_PORODA + " TEXT NOT NULL )");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + DB_NAME);
onCreate(db);
}
}
AddDate (активити для заполнения БД):
public class AddDate extends AppCompatActivity {
private AppBarConfiguration appBarConfiguration;
private ActivityAddDateBinding binding;
EditText TName;
EditText TPoroda;
String color = "";
String date = null;
public AddDate() {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityAddDateBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
RadioGroup rg = findViewById(R.id.rg);
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case -1:
Toast.makeText(getApplicationContext(), "Ничего не выбрано",
Toast.LENGTH_SHORT).show();
break;
case R.id.rb_white:
color = "Белый";
break;
case R.id.rb_yellow:
color = "Желтый";
break;
case R.id.rb_blue:
color = "Синий";
break;
case R.id.rb_red:
color = "Красный";
break;
case R.id.rb_green:
color = "Зеленый";
break;
default:
break;
}
}
});
TPoroda = findViewById(R.id.editTextTextPersonName3);
TName = findViewById(R.id.editTextTextPersonName);
CalendarView cal = findViewById(R.id.calendarView);
cal.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, int month, int day) {
date = String.format("%02d.%02d.%04d", day, month + 1, year);
}
});
Button save = findViewById(R.id.button);
final DBManage db = new DBManage(this);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if ((TName.getText().length() != 0) & (TPoroda.getText().length() != 0) & (color.length() != 0) & (date != null)) {
String name = TName.getText().toString();
String poroda = TPoroda.getText().toString();
SQLiteDatabase sql = db.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(DBManage.C_NAME, name);
cv.put(DBManage.C_PORODA, poroda);
cv.put(DBManage.DB_COLOR, color);
cv.put(DBManage.DB_DATE, date);
sql.insert("dates", null, cv);
Toast.makeText(AddDate.this, "Запись успешно создана", Toast.LENGTH_LONG).show();
Intent i = new Intent(AddDate.this, MainActivity.class);
startActivity(i);
finish();
} else {
Toast toast = Toast.makeText(AddDate.this, "Поля не заполнены", Toast.LENGTH_LONG);
toast.show();
}
}
});
}
}
Подозреваю, что создание записи работает коряво, вот только причину понять не могу. Спасибо!