SQLiteOpenHelper.getWriteableDatabase() null-Zeiger-Ausnahme auf Android
Hatte, habe ich feine Glück SQLite mit geradem, direktem SQL in Android, aber dies ist das erste mal, dass ich mich die Verpackung einer DB in einem ContentProvider. Ich bekomme immer ein null-Zeiger-Ausnahme beim aufrufen von getWritableDatabase()
oder getReadableDatabase()
. Ist das einfach nur ein blöder Fehler, den ich gemacht habe mit Initialisierungen in meinem code oder ist es ein größeres Problem?
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);
}
}
}
Wie immer, vielen Dank für die Hilfe!
--
Nicht sicher, ob dieses detail hilft, aber hier ist LogCat zeigt die Ausnahme:
entfernt tot ImageShack link
Hast du jemals eine Lösung finden?
InformationsquelleAutor Drew Dara-Abrams | 2009-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt:
versuchen:
und sehen, ob das hilft.
Wenn nicht, könntest du post von der
NullPointerException
stack-trace?Oops, du hast Recht-ich denke immer ContentProvider erbt aus dem Kontext, und es funktioniert nicht. Mit Bezug auf die stack-trace, es ist kein laden für mich. Sie können DDMS (oder die DDMS-Perspektive in Eclipse) zu speichern, ein Teil eines stack-trace als text-Datei. Markieren Sie einfach die Linien von Interesse und klicken Sie auf das Symbol "Speichern" in der Symbolleiste des LogCat-tab.
Danke für das Angebot, hilft mehr! Nur den anderen Tag, saß ich mit einem Android-Profi, und er war in der Lage, zu beheben mein problem: tun das getWritableDatabase() als Teil der onCreate (), anstatt wie in der insert()
Hmm, eigentlich jetzt, dass ich ve bekommen, um zu versuchen, die DB in der insert () - Methode, ich bin immer die gleichen null-Zeiger-Ausnahme. Zeit, zu Fragen einige Leute bei Google über diese, gegeben, ich habe immer e-Mails von anderen Wundern über meine "Lösung".
Verwenden Sie
ContentValues
in Ihreminsert()
Methode?InformationsquelleAutor CommonsWare
Dieser Fehler ist fast sicher von einem ungültigen Kontext weitergegeben, in:
InformationsquelleAutor Doug
Ich hatte gerade dieses problem mit der SQLite nullpointerexception in einer nicht-Aktivität und das problem war, dass es hatte einen ungültigen Kontext.
Mein fix war vorbei, der Kontext, in onCreate statt des Konstruktors. Suchen Sie einen Kontext von einem anderen Ort zu tun
getApplicationContext()
.InformationsquelleAutor Joe Plante
versuchen
getWritableDatabase()
in einiger Zeit, nachdem Sie zunächst die HelferSie bekam
NullPointerException
Ursache die Datenbank wurde nicht vollständig vorbereitetund das nicht im ui-thread, oder kann es dazu führen, ANR
InformationsquelleAutor somebody
Ich hatte gerade dieses problem und festgestellt, es war ein bisschen ein Ablenkungsmanöver.
Mein Problem ergab sich aus dem Weg, ich war mit dem ContentProvider.
War ich tatsächlich Zugriff auf den ContentProvider direkt und nicht über den ContentResolver. Es ist im wesentlichen eine einfache Möglichkeit, die Reise bis wenn Ihre neue Verwendung ContentProviders.
Hoffe, das hilft 🙂
InformationsquelleAutor Matt Gaunt
Stellen Sie sicher, wenn Sie beim erstellen der AVD, geben Sie eine gewisse Menge an SD-Karte Platz. Ich hatte das gleiche problem und dieses gelöst. Wenn das nicht hilft, können Sie auch versuchen, starten Sie den emulator mit -wipe-data option.
Was über die -wipe-data option? Vielleicht könnte dies helfen, es zu schaffen.
InformationsquelleAutor jaxvy
Bekam ich das gleiche NullPointerException-Fehler, wenn getReadableDatabase() wird immer aufgerufen, in query (), da war ich falsch Abfragen meine content-provider. Ich kann nicht sehen, nichts falsch mit der Art, wie Sie bauen Ihre Datenbank. getContext() sollte dir die entsprechenden Kontext-Objekt. Allerdings würde ich darauf achten, wie Sie Ihre Abfragen, um die content-Anbieter. Sie sollten sicherstellen, dass Sie haben eine gültige Referenz zu Ihrem content resolver (ie. durch den Aufruf getContentResolver().query(..)) und verwenden, die zum ausführen der Abfrage.
InformationsquelleAutor glacier