質問

I'm getting a crash when trying to open an SQLiteDatabase I have for writing with a Null Pointer Exception. Here's how I instantiate the SQLiteOpenHelper:

private final OpenHelper mOpenHelper;

public static DataManager getInstance() {
    if (sInstance == null) {
        sInstance = new DataManager();
    }
    return sInstance;
}

private DataManager() {
    mOpenHelper = new OpenHelper(MainApp.getInstance(), MainApp.getInstance().getWalletToken());
    SQLiteDatabase.loadLibs(MainApp.getInstance());
}

where MainApp is my application object.

Here's what I'm trying to do:

    SQLiteDatabase db = null;
    try {
        db = mOpenHelper.getWritableDatabase();

        for (Card card : cards) {
            if (card == null) {
                continue;
            }

            addCard(card, db);

            ContentValues values = new ContentValues();
            values.put(DataEntry.COLUMN_NAME_NICKNAME, card.getNickname());

            File imageFile = getImageFile(Integer.toString(card.getIndex()));
            if (ImageUtils.saveImage(card.getCardImage(), imageFile)) {
                values.put(DataEntry.COLUMN_NAME_IMAGE_FILE, imageFile.getAbsolutePath());
            }

            String whereClause = DataEntry.COLUMN_NAME_CARD_INDEX + " = "
                    + card.getIndex();
            db.update(DataEntry.TABLE_NAME, values, whereClause, null);
        }
    } finally {
        if (db != null) {
            db.close();
        }
    }        

And here's the crash output:

03-10 16:49:10.533: E/AndroidRuntime(8771): FATAL EXCEPTION: main
03-10 16:49:10.533: E/AndroidRuntime(8771): java.lang.NullPointerException
03-10 16:49:10.533: E/AndroidRuntime(8771):     at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1957)
03-10 16:49:10.533: E/AndroidRuntime(8771):     at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:901)
03-10 16:49:10.533: E/AndroidRuntime(8771):     at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:944)
03-10 16:49:10.533: E/AndroidRuntime(8771):     at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:107)
03-10 16:49:10.533: E/AndroidRuntime(8771):     at com.mywebsite.DataManager$OpenHelper.getWritableDatabase(DataManager.java:282)

I googled for the source code but that particular line doesn't contain anything that should throw an exception. What am I doing wrong?

役に立ちましたか?

解決

I'd call loadLibs() before new OpenHelper().

Beyond that, my guess is that getWalletToken() is returning null. MainApp.getInstance() is not returning null, otherwise you would be crashing on the getWalletToken() call itself. How is the user providing this "wallet token"?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top