J'ai eu la chance fine en utilisant SQLite avec SQL droite, directement dans Android, mais c'est la première fois que je enroulant un DB dans un ContentProvider. Je reçois toujours une exception de pointeur nul lorsque j'appelle getWritableDatabase()
ou getReadableDatabase()
. Est-ce juste une erreur stupide que j'ai faite avec les initialisations dans mon code ou y at-il un plus gros problème?SQLiteOpenHelper.getWriteableDatabase() NullPointerException sur Android
public class DatabaseProvider extends ContentProvider {
...
private DatabaseHelper databaseHelper;
private SQLiteDatabase db;
...
@Override
public boolean onCreate() {
databaseHelper = new DatabaseProvider.DatabaseHelper(getContext());
return (databaseHelper == null) ? false : true;
}
...
@Override
public Uri insert(Uri uri, ContentValues values) {
db = databaseHelper.getWritableDatabase(); // NULL POINTER EXCEPTION HERE
...
}
private static class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "cogsurv.db";
public static final int DATABASE_VERSION = 1;
public static final String[] TABLES = {
"people",
"travel_logs",
"travel_fixes",
"landmarks",
"landmark_visits",
"direction_distance_estimates"
};
// people._id does not AUTOINCREMENT, because it's set based on server's people.id
public static final String[] CREATE_TABLE_SQL = {
"CREATE TABLE people (_id INTEGER PRIMARY KEY," +
"server_id INTEGER," +
"name VARCHAR(255)," +
"email_address VARCHAR(255))",
"CREATE TABLE travel_logs (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"server_id INTEGER," +
"person_local_id INTEGER," +
"person_server_id INTEGER," +
"start DATE," +
"stop DATE," +
"type VARCHAR(15)," +
"uploaded VARCHAR(1))",
"CREATE TABLE travel_fixes (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"datetime DATE, " +
"latitude DOUBLE, " +
"longitude DOUBLE, " +
"altitude DOUBLE," +
"speed DOUBLE," +
"accuracy DOUBLE," +
"travel_mode VARCHAR(50), " +
"person_local_id INTEGER," +
"person_server_id INTEGER," +
"travel_log_local_id INTEGER," +
"travel_log_server_id INTEGER," +
"uploaded VARCHAR(1))",
"CREATE TABLE landmarks (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"server_id INTEGER," +
"name VARCHAR(150)," +
"latitude DOUBLE," +
"longitude DOUBLE," +
"person_local_id INTEGER," +
"person_server_id INTEGER," +
"uploaded VARCHAR(1))",
"CREATE TABLE landmark_visits (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"server_id INTEGER," +
"person_local_id INTEGER," +
"person_server_id INTEGER," +
"landmark_local_id INTEGER," +
"landmark_server_id INTEGER," +
"travel_log_local_id INTEGER," +
"travel_log_server_id INTEGER," +
"datetime DATE," +
"number_of_questions_asked INTEGER," +
"uploaded VARCHAR(1))",
"CREATE TABLE direction_distance_estimates (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"server_id INTEGER," +
"person_local_id INTEGER," +
"person_server_id INTEGER," +
"travel_log_local_id INTEGER," +
"travel_log_server_id INTEGER," +
"landmark_visit_local_id INTEGER," +
"landmark_visit_server_id INTEGER," +
"start_landmark_local_id INTEGER," +
"start_landmark_server_id INTEGER," +
"target_landmark_local_id INTEGER," +
"target_landmark_server_id INTEGER," +
"datetime DATE," +
"direction_estimate DOUBLE," +
"distance_estimate DOUBLE," +
"uploaded VARCHAR(1))"
};
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.v(Constants.TAG, "DatabaseHelper()");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.v(Constants.TAG, "DatabaseHelper.onCreate() starting");
// create the tables
int length = CREATE_TABLE_SQL.length;
for (int i = 0; i < length; i++) {
db.execSQL(CREATE_TABLE_SQL[i]);
}
Log.v(Constants.TAG, "DatabaseHelper.onCreate() finished");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
for (String tableName : TABLES) {
db.execSQL("DROP TABLE IF EXISTS" + tableName);
}
onCreate(db);
}
}
}
Comme toujours, merci pour l'aide!
-
Je ne sais pas si ce détail aide, mais voici LogCat montrant l'exception:
lien ImageShack mort enlevé
Avez-vous déjà trouvé une solution? –