【问题标题】:SQLite NullPpointerException Error when trying to call a methodSQLite NullPpointerException 尝试调用方法时出错
【发布时间】:2014-03-14 20:55:22
【问题描述】:

目的是从停车场表列“CPNAME”中检索停车场名称,并将这些名称行放入另一个类的数组列表中,微调器将显示该列表。

问题显然出在我的 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() 的类和数组列表:

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();

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

【问题讨论】:

    标签: java android database sqlite nullpointerexception


    【解决方案1】:

    你从未调用过 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 语句无效

    【讨论】:

    • 感谢您的回复。我是否调用 DbHelper.open();在我的 BookTicket 类的 onCreate() 下?当我尝试这个时,它说该方法必须更改为静态,我跟着它但是在那个方法中它说 this.ourDatabase = getWritableDatabase();无法从静态方法引用非静态方法。
    • 首先确保您了解静态的含义。您可以想象静态成员(函数和属性)属于类。非静态成员属于类(对象)的实例。调用静态方法时,不能引用非静态成员。类怎么知道你指的是哪个实例?
    • 当您将方法更改为静态时 this.ourDatabase = getWritableDatabase();生成错误,因为您使用“this”。它的意思是“这个实例”。删除它。
    • 好的,已经取得进展,但现在我收到一条错误消息,提示 getDatabaseLocked()。我检查了我的代码写入停车场数据库的其他位置,但我不知道是什么:@
    【解决方案2】:

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

    【讨论】:

    • 是的,我只是不知道如何解决这个问题。在堆栈上尝试了很多不同的答案,但无济于事......
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多