最初に、私は何時間ものグーグルとSO検索が表示したすべての同様の質問を見てきました。運がない。
次のようにSQLiteOpenHelperを拡張するPropertiesDatabaseというデータベースヘルパークラスがあります。
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はほとんど同じであるため、これらを含めましたが、最初のメソッドは機能し、2番目のメソッドはnullポインター例外をスローします。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行目は更新の呼び出しです。
再度、感謝します!