Android 为什么我的数据库使应用程序强制关闭,但在我清除数据后工作正常?

Android 为什么我的数据库使应用程序强制关闭,但在我清除数据后工作正常?,android,sql,database,sqlite,Android,Sql,Database,Sqlite,如果我为我的应用清除数据,然后运行它,它工作正常。如果我重新打开或重新运行我的应用程序,它将强制关闭并抛出java.lang.NullPointerException?错误在这段代码中 private static class DbHelper extends SQLiteOpenHelper{ public DbHelper(Context context) { super(context, DB_NAME, null, DATABASE_VERSION);

如果我为我的应用清除数据,然后运行它,它工作正常。如果我重新打开或重新运行我的应用程序,它将强制关闭并抛出
java.lang.NullPointerException
?错误在这段代码中

private static class DbHelper extends SQLiteOpenHelper{
    public DbHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DB_TBL + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                KEY_LEVEL + " INTEGER NOT NULL, " + 
                KEY_HEALTH + " INTEGER NOT NULL, " +
                KEY_NAME + " TEXT NOT NULL, " +
                KEY_CRIT + " INTEGER NOT NULL, " +
                KEY_CRIT_RANGE + " INTEGER NOT NULL, " +
                KEY_CRIT_INC + " INTEGER NOT NULL, " +
                KEY_HIT_RANGE + " INTEGER NOT NULL, " +
                KEY_HIT_INC + " INTEGER NOT NULL, " +
                KEY_CHAR_IMG + " INTEGER NOT NULL, " +
                KEY_TOTAL_XP + " INTEGER NOT NULL, " +
                KEY_XP + " INTEGER NOT NULL, " +
                KEY_XP_NEEDED + " INTEGER NOT NULL, " +
                KEY_COINS + " INTEGER NOT NULL, " + 
                KEY_SMALL_POTS + " INTEGER NOT NULL, " +
                KEY_LARGE_POTS + " INTEGER NOT NULL)"
            );

        values = new ContentValues();
        values.put(KEY_NAME, "User1");
        values.put( KEY_LEVEL, 1);
        values.put(KEY_HEALTH, 10);
        values.put(KEY_CRIT, 5);
        values.put(KEY_CRIT_RANGE, 2);
        values.put(KEY_CRIT_INC, 2);
        values.put(KEY_HIT_RANGE, 2);
        values.put(KEY_HIT_INC, 0);
        values.put(KEY_TOTAL_XP, 0);
        values.put(KEY_XP, 0);
        values.put(KEY_XP_NEEDED, 5);
        values.put(KEY_COINS, 5);
        values.put(KEY_SMALL_POTS, 0);
        values.put(KEY_LARGE_POTS, 0);
        values.put(KEY_CHAR_IMG, 1);
        db.insert(DB_TBL,  null, values);

    }    
java.lang.NullPointerException
指向此

  public int getLevel() {
    open();
    int level = values.getAsInteger(KEY_LEVEL);
    close();
    return level;
}
这是我的堆栈跟踪

01-04 14:45:45.694: W/dalvikvm(20858): threadid=9: thread exiting with uncaught exception (group=0x4001e578)
01-04 14:45:45.694: E/AndroidRuntime(20858): FATAL EXCEPTION: UpdateThread
01-04 14:45:45.694: E/AndroidRuntime(20858): java.lang.NullPointerException
01-04 14:45:45.694: E/AndroidRuntime(20858):    at com.tanukiproductions.battleforchristmas.SQLiteTable.getLevel(SQLiteTable.java:110)
01-04 14:45:45.694: E/AndroidRuntime(20858):    at com.tanukiproductions.battleforchristmas.Profile.<init>(Profile.java:57)
01-04 14:45:45.694: E/AndroidRuntime(20858):    at com.tanukiproductions.battleforchristmas.MainMenuScene.onMenuItemClicked(MainMenuScene.java:37)
由于在运行应用程序至少一次后创建新的DbHelper对象时不会调用
onCreate()
,因此
为空

如果要从表中提取此数据,请使用

但这只返回找到的第一个“级别”,请使用
\u id
参数选择特定行。

由于在运行应用程序至少一次后创建新的DbHelper对象时不会调用
onCreate()
,因此
为空

如果要从表中提取此数据,请使用


但这只返回找到的第一个“级别”,使用
\u id
参数选择特定行。

由于某种原因,值没有初始化,它是全局变量吗?在打开和关闭功能中会发生什么?他们正在查询db?值id已初始化,我可以链接open和closeValues。由于某种原因,这些值未初始化,是全局变量吗?在打开和关闭功能中会发生什么?他们正在查询数据库吗?值id已初始化,我可以链接打开和关闭。对不起,我对数据库有点陌生。我将如何使用这个方法?您需要将基本SELECT语句解析为各种子句。上面的
query()
调用相当于
SELECT key\u level FROM table。没问题。在DbHelper方法中放置LogCat语句,如
onCreate()
onUpgrade()
,以帮助您可视化这些不同的方法何时运行(更重要的是何时不运行)。还有一个问题,因为
values
null
如何重写
值。Put(KEY\u XP,XP);value.put(键\u TOTAL\u XP,totalXp);更新(DB_TBL,value,null,null)由于您只是将数据放入
值中,而不是试图从中读取数据,因此创建一个新的
对象。(所以添加
values=newcontentvalues()
)很抱歉,我对数据库有些陌生。我将如何使用这个方法?您需要将基本SELECT语句解析为各种子句。上面的
query()
调用相当于
SELECT key\u level FROM table。没问题。在DbHelper方法中放置LogCat语句,如
onCreate()
onUpgrade()
,以帮助您可视化这些不同的方法何时运行(更重要的是何时不运行)。还有一个问题,因为
values
null
如何重写
值。Put(KEY\u XP,XP);value.put(键\u TOTAL\u XP,totalXp);更新(DB_TBL,value,null,null)由于您只是将数据放入
值中,而不是试图从中读取数据,因此创建一个新的
对象。(因此添加
values=newcontentvalues()
public static void open() throws SQLException{
    ourDatabase = ourHelper.getWritableDatabase();
}

public static void close() throws SQLException{
    ourHelper.close();
}
public int getLevel() {
    int level = -1;
    open();

    Cursor cursor = ourDatabase.query(DB_TBL, new String[] {KEY_LEVEL}, null, null, null, null, null);
    if(cursor.moveToFirst())
        level = cursor.getInt(0); // get the first column from your Select statement, i.e. KEY_LEVEL

    cursor.close();
    close();
    return level;
}