Что происходит, так это то, что getReadableDatabase () вызывает onCreate (), который вызывает getAlbumCount, который вызывает getReadableDatabase (), который вызывает onCreate () ... вы можете видеть, куда это идет.
Простое исправление - это отправить db в качестве параметра getAlbumCount () следующим образом
public class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, KEY_DB_NAME, null, KEY_DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + KEY_TABLE + "(" +
KEY_ID + " INTEGER PRIMARY KEY, " +
KEY_ALBUM_ID + " TEXT, " +
");");
//Inserts pre-defined departments
if (getAlbumCount(db) == 0)
{
InsertAlbum(db);
}
}
int getAlbumCount(SQLiteDatabase db)
{
Cursor cur= db.rawQuery("Select * from "+ KEY_TABLE, null);
int x= cur.getCount();
cur.close();
return x;
}
void InsertAlbum(SQLiteDatabase db)
{
ContentValues cv = new ContentValues();
cv.put(KEY_ALBUM_ID, KEY_ALBUM_ID_VALUE);
................
db.insert(KEY_TABLE, null, cv);
db.close();
}
}
ОТВЕТ НА ОБНОВЛЕНИЕ: Вы получаете исключение нулевого указателя, потому что отправляете null в getAllAlbum ().
SQLiteDatabase db = dbHelper.getWritableDatabse(db);
List<Album> r = dbHelper.getAllAlbum(db);
Гораздо более подходящим решением является перегрузка метода getAllAlbum () следующим образом.
public class DatabaseHelper extends SQLiteOpenHelper {
public List<Album> getAllAlbum() {
//never ever call this method from within onCreate()
return getAllAblum(this.getWritableDatabase());
}
private List<Album> getAllAlbum(SQLiteDatabase db) {
// get results here
//only call this method from within the class
}
}
Вы также можете применить это к предыдущим методам, если вам нужен как внешний, так и внутренний доступ.
Таким образом, вы можете просто вызвать getAllAlbum () без параметров извне и избежать рекурсивных вызовов onCreate ().