首先,我查看了数小时的 google 和 SO 搜索显示的所有类似问题。没运气。
我有一个名为 PropertiesDatabase 的数据库助手类,它扩展了 SQLiteOpenHelper,如下所示:
private static final class PropertiesDatabase extends SQLiteOpenHelper{
static final int DATABASE_VERSION = 1;
private static final String KEY_PROPERTIES_TABLE = "PropertiesTable";
static final String KEY_ID = "_id";
static final String KEY_NAME = "name";
static final String KEY_SIZE = "size";
static final String KEY_PASSWORD = "password";
static final String [] columnsProperties = new String[] { KEY_NAME,
KEY_SIZE, KEY_PASSWORD};
private static String CREATE_TABLE;
public PropertiesDatabase(Context context) {
super(context, KEY_PROPERTIES_TABLE, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
CREATE_TABLE = "create table "
+ KEY_PROPERTIES_TABLE + "("
+ KEY_ID + " integer primary key autoincrement, "
+ KEY_NAME + " text not null, "
+ KEY_SIZE + " integer,"
+ KEY_PASSWORD + " text" + ");";
db.execSQL(CREATE_TABLE);
}
public void changeName(String oldName, String newName){
SQLiteDatabase db = this.getReadableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, newName);
db.update(KEY_PROPERTIES_TABLE, values, KEY_NAME + "=?",
new String[] {oldName});
db.close();
}
public void changeSize(String name, int n){
SQLiteDatabase db = this.getReadableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_SIZE, n);
db.update(KEY_PROPERTIES_TABLE, values, KEY_NAME + "=?",
new String[] {name});
db.close();
}
}
类中还有更多方法,但我包含了 changeName 和 changeSize 因为它们几乎相同,但第一个有效,第二个抛出空指针异常。logcat 说调用
db.update(KEY_PROPERTIES_TABLE, values, KEY_NAME + "=?", new String[] {name});
在 changeSize() 方法中是罪魁祸首。我在该调用之前立即使用 db.isOpen() 进行了检查,并且数据库未打开。但是,在 changeName() 中的更新调用之前,它是打开的。
我不明白为什么一种方法可以正常工作而另一种方法不行。任何帮助解决这个谜团将不胜感激。
感谢您抽出时间来阅读。
编辑:
以下是相关的 logcat 信息:
01-31 13:37:17.315: E/AndroidRuntime(1978): FATAL EXCEPTION: main
01-31 13:37:17.315: E/AndroidRuntime(1978): java.lang.NullPointerException
01-31 13:37:17.315: E/AndroidRuntime(1978): at
android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
01-31 13:37:17.315: E/AndroidRuntime(1978): at
android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115)
01-31 13:37:17.315: E/AndroidRuntime(1978): at
android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1825)
01-31 13:37:17.315: E/AndroidRuntime(1978): at
android.database.sqlite.SQLiteDatabase.replace(SQLiteDatabase.java:1744)
01-31 13:37:17.315: E/AndroidRuntime(1978): at
com.LN.AppName.DatabaseHandler$PropertiesDatabase.changeSize(DatabaseHandler.java:767)
当然,第 767 行是更新的调用。
再次感谢!