Android的NullPointerException异常和GetDatabaseLocked [英] Android NullPointerException and GetDatabaseLocked

查看:230
本文介绍了Android的NullPointerException异常和GetDatabaseLocked的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

林尝试存储的方法中的特定列中的数据,并调用在另一个类的String []其中旋转器将访问该阵列为用户选择,然后将得到存储在另一个数据库显示的列行该方法。

即时得到nulpointerexception,当我尝试和open()数据库的数据库被锁定。对不起,听起来像一个完整的业余的,比较新到Android。预先感谢您的任何帮助。

这是我的code,当我在我的主类调用getInstance和getCPnames()

 的String [] =停车场CarParkDb.getInstance()getCpnames()。

这是我的code数据库:

 包com.example.parkangel;进口的java.util.ArrayList;
进口android.content.ContentValues​​;
进口android.content.Context;
进口android.database.Cursor;
进口android.database.SQLException;
进口android.database.sqlite.SQLiteDatabase;
进口android.database.sqlite.SQLiteOpenHelper;公共类CarParkDb {
    公共静态最后弦乐KEY_ID =_id;
    公共静态最后弦乐KEY_CPNAME =CPNAME;
    公共静态最后弦乐KEY_COST =成本;
    私有静态最后弦乐DATABASE_NAME =CPDB;
    私有静态最后弦乐DATABASE_TABLE =CPTable;
    私有静态最终诠释DATABASE_VERSION = 1;    私人CPDbHelper cpdbHelper;    私人语境ourContext;
    私人SQLiteDatabase ourDatabase;
    私有静态CarParkDb实例;
    私有静态类CPDbHelper扩展SQLiteOpenHelper {        公共CPDbHelper(上下文的背景下){
            超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
            // TODO自动生成构造函数存根
        }@覆盖
        公共无效的onCreate(SQLiteDatabase DB){
            // TODO自动生成方法存根
            db.execSQL(CREATE TABLE+ DATABASE_TABLE +(+
                    KEY_ID +INTEGER PRIMARY KEY AUTOINCREMENT,+
                    KEY_CPNAME +TEXT NOT NULL,+ KEY_COST +TEXTNOT NULL););            db.execSQL(插入+ DATABASE_TABLE +VALUES('1','LearningResource中心','2'););
            db.execSQL(插入+ DATABASE_TABLE +的值('2','ParkandRide','1'););
            db.execSQL(插入+ DATABASE_TABLE +VALUES('3','德哈维兰校园','2'););
            db.execSQL(插入+ DATABASE_TABLE +值(4,多层建筑物','2'););
            db.execSQL(插入+ DATABASE_TABLE +VALUES('5','接待','2'););        }        公共无效的OnOpen(最终SQLiteDatabase DB){
            super.onOpen(DB);
        }        @覆盖
        公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
            // TODO自动生成方法存根            db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE);
            的onCreate(DB);
        }
    }        公共CarParkDb(最终上下文C)
        {
            this.cpdbHelper =新CPDbHelper(C);
            establishDb();
            // ourContext = C;
}
        公共无效establishDb()
        {
            如果(this.ourDatabase == NULL)
            {
                this.ourDatabase = this.cpdbHelper.getWritableDatabase();
            }        }        公共CarParkDb(){
            // TODO自动生成构造函数存根
        }
        公共CarParkDb的open()抛出的SQLException
        {
            的System.out.println(开跑);
            cpdbHelper =新CPDbHelper(ourContext);
            ourDatabase = cpdbHelper.getWritableDatabase();
            返回此;
        }        公共无效的close()
        {
            ourDatabase.close();
        }        / *众长createEntry(字符串CPNAME,字符串费用){
            ContentValues​​ CV =新ContentValues​​();
            cv.put(KEY_CPNAME,CPNAME);
            cv.put(KEY_COST,成本);
            返回ourDatabase.insert(DATABASE_TABLE,空,CV);
        } * /        公共字符串的getData(){
            // TODO自动生成方法存根
            //打开();
            的String [] =列新的String [] {KEY_ID,KEY_CPNAME,KEY_COST};
            光标C = ourDatabase.query(DATABASE_TABLE,列,NULL,NULL,NULL,NULL,NULL);
            字符串结果=;            INT iRow = c.getColumnIndexOrThrow(KEY_ID);
            INT iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
            INT iCost = c.getColumnIndexOrThrow(KEY_COST);            为(c.moveToFirst();!c.isAfterLast(); c.moveToNext()){
                结果=结果+ c.getString(iRow)++ c.getString(iCpname)++ c.getString(iCost)++\\ n;
                c.close();
                ourDatabase.close();
            }
            返回结果;
        }        公共静态CarParkDb的getInstance()
        {
            同步(CarParkDb.class)
        {
            如果(例如== NULL)
            {
                例如=新CarParkDb();
            }
            返回实例;
        }
        }    公众的String [] getCpnames()
        {
            //打开();
            如果(ourDatabase == NULL)的System.out.println(为空);
            光标C = NULL;            ArrayList的<串GT;名单=新的ArrayList<串GT;();
            ourDatabase = cpdbHelper.getReadableDatabase();
            // SQLiteDatabase分贝= cpdbHelper.getReadableDatabase();
            查询字符串=SELECT+ KEY_CPNAME +FROM+ DATABASE_TABLE;            {
            C = this.ourDatabase.rawQuery(查询,NULL);
            INT iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
            如果(c.moveToFirst())
                {
                    做
                    {
                    list.add(c.getString(iCpname));;
                    }
                    而(c.moveToNext());
                }
                如果(C =空&安培;!&安培;!c.isClosed())
                {
                c.close();
                ourDatabase.close();
                }
                返回list.toArray(新的String [] {});
            }
        }}** ** LogCat中    一月3日至12日:32:39.759:E / AndroidRuntime(4176):因:显示java.lang.NullPointerException
    一月3日至12日:32:39.759:E / AndroidRuntime(4176):    在com.example.parkangel.CarParkDb.getCpnames(CarParkDb.java:191)
    一月3日至12日:32:39.759:E / AndroidRuntime(4176):    在com.example.parkangel.BookTicket<&初始化GT;(BookTicket.java:22)
    一月3日至12日:32:39.759:E / AndroidRuntime(4176):    在java.lang.Class.newInstanceImpl(本机方法)
    一月3日至12日:32:39.759:E / AndroidRuntime(4176):    在java.lang.Class.newInstance(Class.java:1208)


解决方案

尝试更新的getInstance() code这一点:

 公共静态CarParkDb的getInstance(上下文C)//<  - 添加上下文参数
{
    同步(CarParkDb.class)
    {
        如果(例如== NULL)
        {
            例如=新CarParkDb(C); //< - 在构造函数中使用的上下文
        }
        返回实例;
    }
}

这个问题似乎是,你使用一个构造函数(用于 CarParkDb ),什么也不做。你有另一个构造函数一个上下文作为参数并初始化一些你以后使用的对象。

Im trying to store a particular columns data in a method and call that method in another classes String [] where a spinner will access that array to display the columns rows for the user to select which will then get stored in another database.

Im getting nulpointerexception and when I try and open() the database the database gets locked. Sorry for sounding like a complete amateur, relatively new to android. Thank you in advance for any help.

Here is my code when I call getInstance() and getCPnames() in my main class

    String[] carParks = CarParkDb.getInstance().getCpnames();

Here is my code for the database:

package com.example.parkangel;

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

public class CarParkDb {


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


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

    private CPDbHelper cpdbHelper;

    private Context ourContext;
    private SQLiteDatabase ourDatabase;
    private static CarParkDb instance;


    private static class CPDbHelper extends SQLiteOpenHelper{

        public CPDbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }



@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 + " TEXTNOT NULL);");

            db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values('1','LearningResource Center','2');");
            db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('2','ParkandRide','1');");
            db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('3','deHavilland Campus','2');");
            db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values('4','MultiStorey Building','2');");
            db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values('5','Reception','2');");

        }

        public void onOpen(final SQLiteDatabase db) {
            super.onOpen(db);
        }

        @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 CarParkDb (final Context c)
        {
            this.cpdbHelper= new CPDbHelper(c);
            establishDb();
            //ourContext = c;
}
        public void establishDb()
        {
            if (this.ourDatabase == null)
            {
                this.ourDatabase = this.cpdbHelper.getWritableDatabase();
            }

        }

        public CarParkDb() {
            // TODO Auto-generated constructor stub
        }
        public CarParkDb open() throws SQLException
        {
            System.out.println ("running open");
            cpdbHelper = new CPDbHelper(ourContext);
            ourDatabase = cpdbHelper.getWritableDatabase();
            return this;
        }

        public void close()
        {
            ourDatabase.close();
        }

        /*public long createEntry(String cpname, String cost){
            ContentValues cv = new ContentValues();
            cv.put(KEY_CPNAME, cpname);
            cv.put(KEY_COST, cost);
            return ourDatabase.insert(DATABASE_TABLE, null, cv);
        }*/

        public String getData() {
            // TODO Auto-generated method stub
            //open();
            String[] columns = new String[] {KEY_ID, KEY_CPNAME, KEY_COST};
            Cursor  c = ourDatabase.query(DATABASE_TABLE, columns, null,null,null, null, null);
            String result = " ";

            int iRow = c.getColumnIndexOrThrow(KEY_ID);
            int iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
            int iCost = c.getColumnIndexOrThrow(KEY_COST);

            for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
                result = result + c.getString(iRow) + " " +c.getString(iCpname) + " " + c.getString(iCost) + " " + "\n";
                c.close();
                ourDatabase.close();
            }
            return result;
        }

        public static CarParkDb getInstance()
        {
            synchronized(CarParkDb.class)
        {
            if (instance == null)
            {
                instance = new CarParkDb();
            }   
            return instance;
        }
        }

    public String[] getCpnames()
        {
            //open();
            if (ourDatabase == null) System.out.println ("is null");
            Cursor c = null;

            ArrayList<String> list = new ArrayList<String>();
            ourDatabase = cpdbHelper.getReadableDatabase();
            //SQLiteDatabase db = cpdbHelper.getReadableDatabase();
            String query = "SELECT " + KEY_CPNAME + " FROM " + DATABASE_TABLE;



            {
            c = this.ourDatabase.rawQuery(query, null);
            int iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
            if (c.moveToFirst())
                {
                    do
                    {
                    list.add(c.getString(iCpname));;
                    }           
                    while (c.moveToNext());
                }
                if (c != null && !c.isClosed())
                {
                c.close();
                ourDatabase.close();
                }
                return list.toArray(new String[]{});
            }
        }

} 

**LogCat**

    03-12 01:32:39.759: E/AndroidRuntime(4176): Caused by:java.lang.NullPointerException
    03-12 01:32:39.759: E/AndroidRuntime(4176):     

    at com.example.parkangel.CarParkDb.getCpnames(CarParkDb.java:191)
    03-12 01:32:39.759: E/AndroidRuntime(4176):     

    at com.example.parkangel.BookTicket.<init>(BookTicket.java:22)
    03-12 01:32:39.759: E/AndroidRuntime(4176):     

    at java.lang.Class.newInstanceImpl(Native Method)
    03-12 01:32:39.759: E/AndroidRuntime(4176):     

    at java.lang.Class.newInstance(Class.java:1208)

解决方案

Try updating your getInstance() code with this:

public static CarParkDb getInstance(Context c) // <-- added context as parameter
{
    synchronized(CarParkDb.class)
    {
        if (instance == null)
        {
            instance = new CarParkDb(c); // <-- used context in constructor
        }   
        return instance;
    }
}

The problem seems to be that you're using a constructor (for CarParkDb) that does nothing. You have another constructor that takes a Context as parameter and initializes some of the objects that you're using later.

这篇关于Android的NullPointerException异常和GetDatabaseLocked的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆