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
类中。因此无需在fragmentdb.getReadableDatabase()中再次写入代码>我被教导从活动中调用片段方法,以使片段可重用,那么我如何将代码延迟到片段被附加。