2015-06-17 4 views
0

Он продолжает говоритьAndroid базы данных нулевые фрагменты

 getReadableDatabse cant be invoked on null object which is the database. 

Так что мой 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; 
} 

Основная деятельность: посланный из фрагмента а к активности и активности обновления фрагмента 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()); 
} 

Возвращает к первому сообщению журнала, но потом говорит, что мой DataBase является 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()); 
+0

пост вы код, чтобы мы могли понять больше –

+0

Добавлен мой основной код активности, который вызывает addAthleteToList функции() на фрагмент –

+0

, что о dbHelper класса –

ответ

0

The db инициализируется только в onActivityCreated() в жизненном цикле фрагмента, но вы вызываете addAthleteToList() сразу после построения фрагмента. Метод жизненного цикла еще не запущен.

Как правило, не вызывайте методы фрагмента вне обратных вызовов жизненного цикла фрагмента. Чтобы передать данные фрагменту извне, используйте Bundle и setArguments(). Отложите код, которому требуется Context или Activity, до тех пор, пока фрагмент не будет присоединен к одному из них, например, onAttach() или более поздней версии жизненного цикла.

В коде есть и другие проблемы, такие как сравнение строк с == и не проверка результата moveToFirst().

+0

Меня научили использовать методы фрагментов из активности, чтобы сделать фрагменты повторно используемыми, так как я могу отложить отсрочку кода до тех пор, пока фрагмент не будет прикреплен. –

Смежные вопросы