Ошибка с SQLite и RecyclerView - убедитесь, что курсор инициализирован правильно, прежде чем получить доступ к данным из него - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь перечислить все элементы из базы данных, используя RecyclerView.Однако я получаю сообщение об ошибке, что курсор не может найти индекс моего столбца.Я проверил, правильно ли указано имя столбца и есть ли данные в таблице

Ошибка:

E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 9 rows, 7 columns.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.nex_.mobiledev_assignment1, PID: 24735
java.lang.IllegalStateException: Couldn't read row 0, col -1 from 
CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

DatabaseHelper

private static DatabaseHelper ourInstance;

private static final String DATABASE_NAME = "Assignemnt2.db";
private static final String TRACKABLE_TABLE = "trackable";
private static final String TRACKABLE_COL_1 = "ID";
private static final String TRACKABLE_COL_2 = "Name";
private static final String TRACKABLE_COL_3 = "Des";
private static final String TRACKABLE_COL_4 = "URL";
private static final String TRACKABLE_COL_5 = "Category";

public static final String TRACKING_TABLE = "tracking";
public static final String TRACKING_COL_1 = "ID";
public static final String TRACKING_COL_2 = "title";
private static final String TRACKING_COL_3 = "startTime";
public static final String TRACKING_COL_4 = "meetTime";
private static final String TRACKING_COL_5 = "endTime";
private static final String TRACKING_COL_6 = "meetLocation";
private static final String TRACKING_COL_7 = "trackableID";

public static synchronized DatabaseHelper getInstance(Context context){
    if (ourInstance == null){
        ourInstance = new DatabaseHelper(context.getApplicationContext());
    }
    return ourInstance;
}

private DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TRACKABLE_TABLE + " (ID INTEGER PRIMARY KEY, NAME TEXT, DES TEXT, URL TEXT, CATEGORY TEXT) ");
    db.execSQL("create table " + TRACKING_TABLE + " (ID TEXT PRIMARY KEY, TITLE TEXT, STARTTIME TEXT, MEETTIME TEXT, ENDTIME TEXT, MEETLOCATION TEXT, TRACKABLEID INTEGER)");
}

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

public  boolean insertTrackaleData(int ID, String name, String description, String URL, String category){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(TRACKABLE_COL_1, ID);
    contentValues.put(TRACKABLE_COL_2, name);
    contentValues.put(TRACKABLE_COL_3, description);
    contentValues.put(TRACKABLE_COL_4, URL);
    contentValues.put(TRACKABLE_COL_5, category);
    double result = db.insert(TRACKABLE_TABLE, null, contentValues);
    if (result == -1){
        return false;
    }else {
        return  true;
    }
}

public  boolean insertTrackingData(String ID, String title, String startTime, String meetTime, String endTime, String meetLocation, int trackableID){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues2 = new ContentValues();
    contentValues2.put(TRACKING_COL_1, ID);
    contentValues2.put(TRACKING_COL_2, title);
    contentValues2.put(TRACKING_COL_3, startTime);
    contentValues2.put(TRACKING_COL_4, meetTime);
    contentValues2.put(TRACKING_COL_5, endTime);
    contentValues2.put(TRACKING_COL_6, meetLocation);
    contentValues2.put(TRACKING_COL_7, trackableID);
    double result = db.insert(TRACKING_TABLE, null, contentValues2);
    if (result == -1){
        return false;
    }else {
        return  true;
    }
}

public Cursor getAllItems(){
    SQLiteDatabase db = this.getReadableDatabase();
    return db.query(
            TRACKING_TABLE,
            null,
            null,
            null,
            null,
            null,
            TRACKING_COL_2 + " DESC"
    );
}

TrackingAdapter Class

private Context mContext;
private Cursor mCursor;

public  TrackingListRecycleViewAdapter(Context context, Cursor cursor){
    mContext = context;
    mCursor = cursor;
}

public class TrackingListViewHolder extends RecyclerView.ViewHolder{
    public TextView trackingTitle;
    public TextView trackingMeetTime;

    public TrackingListViewHolder(View itemView) {
        super(itemView);
        trackingTitle = itemView.findViewById(R.id.trackingTitle);
        trackingMeetTime = itemView.findViewById(R.id.trackingMeetTime);
    }
}

@Override
public TrackingListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    View view = inflater.inflate(R.layout.tracking_list_item, parent, false);
    return new TrackingListViewHolder(view);
}

@Override
public void onBindViewHolder(TrackingListViewHolder holder, int position) {
    if (!mCursor.moveToPosition(position)){
        return;
    }

    System.out.println("Cursor: " + mCursor.getCount());

    String title = mCursor.getString(mCursor.getColumnIndex(DatabaseHelper.TRACKING_COL_1));
    String meetTime = mCursor.getString(mCursor.getColumnIndex(DatabaseHelper.TRACKING_COL_4));

    holder.trackingTitle.setText(title);
    holder.trackingMeetTime.setText(meetTime);

}
//Get all trackings
@Override
public int getItemCount() {
    return mCursor.getCount();

}

Я мог бы что-то здесь упустить, поэтому любая гепатит очень бы оценила

...