Не получается добавить данные в базу данных
Я использую бд SQLite для сохранения данных, но когда я запускаю свое приложение, переменная cursor остается пустой, и когда я достаю данные из него появляется ошибка:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 9095
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:521)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139)
at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:71)
at com.example.myapplication.DatabaseCalendar.getDates(DatabaseCalendar.java:81)
at com.example.myapplication.CalendarAdapter.getView(CalendarAdapter.java:44)
at android.widget.AbsListView.obtainView(AbsListView.java:2398)
at android.widget.GridView.onMeasure(GridView.java:1086)
at android.view.View.measure(View.java:25773)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6980)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25773)
at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:480)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:277)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
at android.view.View.measure(View.java:25773)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6980)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25773)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6980)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25773)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6980)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:761)
at android.view.View.measure(View.java:25773)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3608)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2407)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2677)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2126)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8649)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037)
at android.view.Choreographer.doCallbacks(Choreographer.java:845)
at android.view.Choreographer.doFrame(Choreographer.java:780)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
W/System: A resource failed to call close.
Класс базы данных:
public DatabaseCalendar(Context context) {
super(context, DBName, null, DATABASE_VERSION);
//3rd argument to be passed is CursorFactory instance
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_HABITS_TABLE = " CREATE TABLE " + datesTable + " ( "
+ id + " INTEGER PRIMARY KEY, " + habitId + " INTEGER, "
+ month + " TEXT, "+dates +" INTEGER "+" ) ";
db.execSQL(CREATE_HABITS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + datesTable);
onCreate(db);
}
void addDate(int habId, int d) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(habitId, habId);
values.put(dates, d);
db.insert(datesTable, null, values);
db.close();
}
public ArrayList<Integer> getDates() {
ArrayList<Integer> list = new ArrayList<>();
String selectQuery = " SELECT dates FROM datesTable";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery,null);
if (cursor.getCount()!=0) {
do {
list.add(cursor.getInt(0));
list.add(7);
} while (cursor.moveToNext());
}
cursor.close();
return list;
}
public int updateHabit(int habId, int d, int id) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(dates, d);
return db.update(datesTable, values, id + " = ?",
new String[]{String.valueOf(id)});
}
}
Ответы (1 шт):
Автор решения: Roman C
→ Ссылка
Перед использованием курсора надо перейти на первую запись.
if (cursor.moveToFirst()) {
do {
list.add(cursor.getInt(cursor.getColumnIndex("dates")));
list.add(7);
} while (cursor.moveToNext());
}