3

首先,我查看了数小时的 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 行是更新的调用。

再次感谢!

4

2 回答 2

1

我认为问题是你的类是静态的,因为我知道只有嵌套类可能是静态的。尝试使用标准方法来处理数据库,像这样

于 2013-01-31T18:24:23.430 回答
1

getReadableDatabase()首先:当你想写入数据库时​​不要使用- 更新是写入。改为使用getWritableDatabase()。大多数情况下,这不会导致任何问题,但它可以

此外,您通常应该在代码中保留一个SQLiteDatabase 实例。SQLiteOpenHelper请参阅代码中的此注释:

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

首次使用时创建一个可写 对象,并在所有方法中使用它。当您真正完成与数据库相关的代码时,请注意您的游标并关闭数据库。SQLiteDatabaseSQLiteOpenHelper

于 2013-02-01T13:25:14.907 回答