SQLite NullPpointerException尝试调用方法时出错

时间:2014-03-14 20:55:22

标签: java android database sqlite nullpointerexception

目的是从停车场表格栏中检索停车场名称' CPNAME'并将这些名称行放在另一个班级中。旋转器将显示的arraylist。

问题显然是我的getCpNames()方法,特别是在这一行:

Cursor  c = ourDatabase.query(DATABASE_TABLE, columns, KEY_CPNAME, null, null, null,
            null);

我在LogCat上遇到的错误:

Caused by: java.lang.NullPointerException
at com.example.parkangel.DbHelper.getCpnames(DbHelper.java:93)
at com.example.parkangel.BookTicket.<init>(BookTicket.java:19)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)

我的数据库类代码:

package com.example.parkangel;

import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DbHelper extends SQLiteOpenHelper
{
private static DbHelper dbHelper;
private Context ourContext;
private static DbHelper instance;
private static SQLiteDatabase ourDatabase;

private static final String DATABASE_NAME = "CPDB.db";
private static final String DATABASE_TABLE = "CPTable";
private static final int DATABASE_VERSION = 1;

public static final String KEY_ID = "_id";
public static final String KEY_CPNAME = "cpname";
public static final String KEY_COST = "cost";

    public DbHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub 
        this.ourContext = context;
    }

    public static DbHelper getInstance(Context context)
    {
        if (instance == null)
        {
            instance = new DbHelper(context);   
        }
        return instance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
        KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
        KEY_CPNAME + " TEXT NOT NULL, " + KEY_COST + " TEXT NOT NULL);");

        db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('1','Learning
                    Resource Center','2');");
        db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('2','Park and
                    Ride','1');");
        db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('3','de 
                    Havilland Campus','2');");
        db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('4','Multi
                    Storey Building','2');");
        db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values 
                    ('5','Reception','2');");   
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }

    public synchronized DbHelper open() throws SQLException
    {
        System.out.println ("running open");
        if(ourDatabase == null || !ourDatabase.isOpen());
        this.ourDatabase = getWritableDatabase();
        return this;
    }   

    public static String[] getCpnames()
    {
        String[] columns = new String[] {KEY_ID, KEY_CPNAME, KEY_COST};
        Cursor  c = ourDatabase.query(DATABASE_TABLE, columns, KEY_CPNAME,
                    null, null, null, null);
        ArrayList<String> list = new ArrayList<String>();

        if (c != null)
        {
            c.moveToFirst();
            do
            {
                list.add(c.getString(0));
            }           
            while (c.moveToNext());
        }
        if (ourDatabase == null) System.out.println ("is null");

        return list.toArray(new String[]{});
    }   
}

这是我调用getCpnames()的类和arraylist:

package com.example.parkangel;

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class BookTicket extends Activity implements OnClickListener{

Spinner spinner, spinner2;
DbHelper dbhelper = DbHelper.getInstance(this);
String[] carParks = DbHelper.getCpnames();

我是初学者,所以对任何业余错误表示歉意。先感谢您!

2 个答案:

答案 0 :(得分:0)

最可能的解释是ourDatabase为空。您未能致电DBHelper.open()进行设置。

答案 1 :(得分:0)

你从未打电话给DbHelper.open();

顺便说一下,我也看到了一个潜在的问题

public synchronized DbHelper open() throws SQLException
{
    System.out.println ("running open");
    if(ourDatabase == null || !ourDatabase.isOpen());
    this.ourDatabase = getWritableDatabase();
    return this;
}   

特别是在这条线上         if(ourDatabase == null ||!ourDatabase.isOpen());

分号“;”在行尾使if语句无效