Android数据库空片段

Android数据库空片段,android,sqlite,android-fragments,android-sqlite,Android,Sqlite,Android Fragments,Android Sqlite,它一直在说 getReadableDatabse cant be invoked on null object which is the database. 由于某种原因,我的数据库是空的 DBHelper: // Create tables or drop if new version public dbHelper(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } pu

它一直在说

     getReadableDatabse cant be invoked on null object which is the database. 
由于某种原因,我的数据库是空的

DBHelper:

// Create tables or drop if new version
public dbHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public Athlete getLastInsertedAthlete(){

    Log.e("", "TEST!!!!!!!!");

    Athlete athlete = new Athlete();
    SQLiteDatabase db = this.getReadableDatabase();


    Cursor cursor = db.rawQuery("SELECT MAX(" + COL_ATHLETE_ID + ") AS " + COL_ATHLETE_ID + ", " +
            COL_FIRST_NAME + ", " + COL_LAST_NAME + ", " + COL_AGE + ", " + COL_GRADE +
            " FROM " + TABLE_ATHLETES, null);
    cursor.moveToFirst();
    int lastAthleteID = cursor.getInt(cursor.getColumnIndex(COL_ATHLETE_ID));
    Log.e("", "Athlete ID: " + lastAthleteID);
    athlete.setAthleteID(lastAthleteID);

    cursor = db.rawQuery("SELECT " + COL_EVENT + " FROM " + TABLE_ATHLETES +
    " INNER JOIN " + TABLE_ATHLETES_EVENTS + " ON " + TABLE_ATHLETES + "." + COL_ATHLETE_ID +
            " = " + TABLE_ATHLETES_EVENTS + "." + COL_ATHLETE_ID +
            " INNER JOIN " + TABLE_EVENTS + " ON " + TABLE_ATHLETES_EVENTS + "." + COL_EVENT_ID +
            " = " + TABLE_EVENTS + "." + COL_EVENT_ID +
            " WHERE " + TABLE_ATHLETES + "." + COL_ATHLETE_ID + " = ?", new String[] {String.valueOf(athlete.getAthleteID())});

    cursor.moveToFirst();
    athlete.setFirstName(cursor.getString(cursor.getColumnIndex(COL_FIRST_NAME)));
    athlete.setLastName(cursor.getString(cursor.getColumnIndex(COL_LAST_NAME)));
    athlete.setAge(cursor.getInt(cursor.getColumnIndex(COL_AGE)));
    athlete.setGrade(cursor.getString(cursor.getColumnIndex(COL_GRADE)));

     int i = 0;
    if (cursor.moveToFirst()) {
        do {
            String event = cursor.getString(cursor.getColumnIndex(COL_EVENT));
            athlete.addEvent(event);
            Log.e("", "Events: " + athlete.getEvents().get(i));
            i++;
        } while (cursor.moveToNext());
    }
    return athlete;
}
主活动:从片段a发送到活动,活动更新片段B

// Sends athlete information to athlete list
@Override
public void send(String confirmation) {
    if(confirmation == "Athlete Added!") {
        AthletesList athletesList = getAthleteListFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, athletesList, "athletesList");
        athletesList.addAthleteToList();
    }else{
        Toast.makeText(this, "Error: message confirmation incorrect!", Toast.LENGTH_SHORT).show();
    }
}
public AthletesList getAthleteListFragment(){
    AthletesList athletesList = (AthletesList) getSupportFragmentManager().findFragmentByTag("athletesList");
    if(athletesList == null){
        athletesList = new AthletesList();
    }
    return athletesList;
}
在创建的活动中在此创建数据库实例。这是一个片段

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    db = new dbHelper(getActivity());
}
获取第一条日志消息,但随后表示我的数据库为
null

public void addAthleteToList(){
    Log.e("", "Getting to addAthleteToList()");
    db.getReadableDatabase();
    Athlete athlete = db.getLastInsertedAthlete();
    db.close();
    Log.e("", "Athlete ID to be added: " + athlete.getAthleteID());

db
仅在片段生命周期中的
onActivityCreated()
中初始化,但在构建片段后,您将立即调用
addAthletoList()
。生命周期方法尚未运行

通常,不要在片段生命周期回调之外调用片段方法。要从外部将数据传递到片段,请使用
捆绑包
setArguments()
。推迟需要
上下文
活动
的代码,直到片段附加到一个片段,即
onAttach()
或生命周期中的更高版本


代码中还有其他问题,例如字符串与
==
的比较,以及没有检查
moveToFirst()

发布代码的结果,这样我们就可以了解更多添加了我的主要活动代码,在片段上调用addAthletoList()函数dbHelper类added helper类呢,一个基本的帮助器类,如果未创建,则创建数据库,但它已被创建。您已调用
SQLiteDatabase db=this.getReadableDatabase()
DBHelper
类中。因此无需在fragment
db.getReadableDatabase()中再次写入我被教导从活动中调用片段方法,以使片段可重用,那么我如何将代码延迟到片段被附加。