java - 运行时异常: NullPointerException with SQLite Database

标签 java android sqlite

我有一个带有 Google map 和标记的 Andorid 应用程序。如果您单击一个标记,您将进入该位置的“主屏幕”,您可以在其中使用按钮开始测验。完成 5 道多项选择题后,将显示分数(1 - 5 分)。至此一切正常。 现在我想将分数保存在 SQLite 数据库中,并在分数为 5 时更改“主屏幕”上的图像。 现在,每次我测试并单击标记打开特定位置的“主屏幕”(如果分数 = 5,则应更改图像),应用程序就会崩溃。 到目前为止,表中没有任何数据,因为我从未通过测验来保存分数。如果有人发现错误,我将非常感激!

这是我的代码:

数据库助手:

public class DbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 7;
private static final String DATABASE_NAME = "CE";

public static final String SCORE_TABLE = "score";
public static final String COLUMN_ID = "ID";
public static final String COLUMN_SCORE = "SCORE";
public static final String COLUMN_MARKERID = "MARKERID";

 private SQLiteDatabase dbase;

 public DbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

}
@Override
public void onCreate(SQLiteDatabase db) {
    //Hier alle Tables erstellen

    String create_query = "CREATE TABLE IF NOT EXITS " + SCORE_TABLE + " ( "
            + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + COLUMN_SCORE + " INTEGER, "
            + COLUMN_MARKERID + " TEXT) ";
    db.execSQL(create_query);
}

public void addScore (DbHelper dbh, Integer score, String markerID) {
    dbase = dbh.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(COLUMN_SCORE, score);
    cv.put(COLUMN_MARKERID, markerID);
    dbase.insert(SCORE_TABLE, null, cv);
}

public Cursor getScore(DbHelper dbh) {
    dbase = dbh.getReadableDatabase();
    String columns[] = {COLUMN_SCORE, COLUMN_MARKERID};
    Cursor cursor = dbase.query(SCORE_TABLE, columns, null, null, null, null, null);
    return cursor;
}

在 ResultActivity 中完成测验后将分数写入数据库:

public class ResultActivity extends Activity {

String markerID;
int score;
TextView t=(TextView)findViewById(R.id.textResult);
Button saveButton = (Button) findViewById(R.id.saveButton);
Context context = this;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.result_layout);

    Bundle b = getIntent().getExtras();
    score = b.getInt("score");
    markerID = b.getString("markerID");
}

saveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DbHelper dbh = new DbHelper(context);
            dbh.addScore(dbh,score,markerID);
        }
    });
}

查看“主屏幕”此标记上保存的分数:

public class Discover extends ActionBarActivity {

TextView InfoHeadline;
ImageView ImageDone;
Button QuizButton;

String markerID;

Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.discover_layout);

    InfoHeadline = (TextView)findViewById(R.id.InfoUeberschrift);
    ImageDone =(ImageView)findViewById(R.id.imageDone);
    QuizButton = (Button)findViewById(R.id.QuizButton);

//get markerID from previous google maps activity
    if (savedInstanceState == null) {
        Bundle extras = getIntent().getExtras();
        if(extras == null) {
            markerID= null;
        } else {
            markerID= extras.getString("MarkerID");
        }
    } else {
        markerID = (String) savedInstanceState.getSerializable("MarkerID");
    }

    InfoHeadline.setText(markerID);

    DbHelper dbh  = new DbHelper(context);
    Cursor cursor = dbh.getScore(dbh);
    cursor.moveToFirst();
    do {
        if (Integer.parseInt(cursor.getString(0))== 5 && InfoHeadline.toString().equals(cursor.getString(1))){
            ImageDone.setImageResource(R.drawable.markerdone);
        }
    }while(cursor.moveToNext());
}

public void StartQuiz (View v) {
    Intent intent = new Intent(Discover.this,QuizActivity.class);
    intent.putExtra("MarkerID", markerID);
    startActivity(intent);
}
}

这是崩溃报告:

java.lang.RuntimeException: Unable to start activity ComponentInfo{de.marmor.discover/de.marmor.discover.Discover}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2345)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2407)
        at android.app.ActivityThread.access$800(ActivityThread.java:149)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:211)
        at android.app.ActivityThread.main(ActivityThread.java:5321)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
        at de.marmor.discover.DbHelper.getScore(DbHelper.java:71)
        at de.marmor.discover.Discover.onCreate(Discover.java:46)
        at android.app.Activity.performCreate(Activity.java:5933)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)`

...

最佳答案

context在你的Discover未初始化,您传递的是 null为您的 DbHelper 提供背景信息.

DiscoverActivity和一个ActivityContext ,你可以使用this代替context .

关于java - 运行时异常: NullPointerException with SQLite Database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546121/

相关文章:

android - 为部分文本使用自定义字体

android - 如何将评级栏的可编辑属性设置为 false

mysql - 地址簿 : Turn an "at least one list suffices" query to an "all lists need to be present"

sqlite - 为 Windows Phone 8 构建 SQLite

java - EnableTransactionManagement 无法解析为类型 2

android - 使用 SpringFramework Android Rest Client 出现 422 错误时获取 Web 服务消息

java - 两个程序如何在 Java 中互相交谈?

mysql - 在 SQL 中有效地加入间隔范围

java - "Java, a Beginner' s 指南中的 While 语句示例”

java - 应用特定数据库