3

最初に、私は何時間ものグーグルと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行目は更新の呼び出しです。

再度、感謝します!

4

2 に答える 2

1

最初に:getReadableDatabase()データベースに書き込みたい場合は使用しないでください。更新は書き込みです。getWritableDatabase()代わりに使用してください。ほとんどの場合、これで問題は発生しませんが、問題が発生する可能性があります。

また、通常、コード内で SQLiteDatabase の1 つのインスタンスを保持する必要があります。SQLiteOpenHelperのコードでこのコメントを参照してください。

// Darn! The user closed the database by calling mDatabase.close().

最初に を使用するときに書き込み可能な オブジェクトを1 つ作成し、それをすべてのメソッド内で使用します。データベース関連のコードが完全に終了した場合にのみ、カーソルに注意してデータベースを閉じてください。SQLiteDatabaseSQLiteOpenHelper

于 2013-02-01T13:25:14.907 に答える
1

問題は、ネストされたクラスのみが静的である可能性があることを知っているため、クラスが静的であることだと思います。標準的な方法を使用して、データベースを操作してみてください。このように

于 2013-01-31T18:24:23.430 に答える