Android SQLite Database insert()方法导致NullPointerException

Android SQLite Database insert()方法导致NullPointerException,android,database,sqlite,nullpointerexception,Android,Database,Sqlite,Nullpointerexception,当我试图在数据库中插入一行时,我得到一个NullPointerException。我检查了很多类似的问题,尝试了很多东西,但我就是看不出问题出在哪里 我在这里得到getDatabase()上的NullPointerException 我使用的数据库类如下newmydatabase(context).addOrUpdate(bus) Bus类只是一个只有getter/setter的模型类,我在调试期间检查了这些值,没有访问任何空值 这是我的数据库类: public class MyDatabase

当我试图在数据库中插入一行时,我得到一个
NullPointerException
。我检查了很多类似的问题,尝试了很多东西,但我就是看不出问题出在哪里

我在这里得到
getDatabase()上的
NullPointerException

我使用的数据库类如下
newmydatabase(context).addOrUpdate(bus)

Bus
类只是一个只有getter/setter的模型类,我在调试期间检查了这些值,没有访问任何空值

这是我的数据库类:

public class MyDatabase implements IDatabaseOperations<Bus>
{
    public static final String KEY_BUSSES_NUMBER = "busNumber";
    public static final String KEY_BUSSES_SOURCE = "busSource";
    public static final String KEY_BUSSES_DESTINATION = "busDestination";
    public static final String KEY_BUSSES_ROUTE = "busRoute";
    public static final String KEY_BUSSES_ISSTARRED = "busIsStarred";
    public static final String KEY_BUSSES_TIMESH = "busTimesH";
    public static final String KEY_BUSSES_TIMESC = "busTimesC";
    public static final String KEY_BUSSES_TIMESP = "busTimesP";

    private static final String DATABASE_NAME = "database";
    private static final int DATABASE_VERSION = 1;

    private static final String TABLE_NAME_BUSSES = "busses";

    private static final String CREATE_SQL = "CREATE TABLE " + TABLE_NAME_BUSSES + " ("
                                            + KEY_BUSSES_NUMBER + " INTEGER PRIMARY KEY NOT NULL, "
                                            + KEY_BUSSES_SOURCE + " TEXT NOT NULL, "
                                            + KEY_BUSSES_DESTINATION + " TEXT NOT NULL, "
                                            + KEY_BUSSES_ROUTE + " TEXT, "
                                            + KEY_BUSSES_ISSTARRED + " TEXT NOT NULL, "
                                            + KEY_BUSSES_TIMESH + " TEXT, "
                                            + KEY_BUSSES_TIMESC + " TEXT, "
                                            + KEY_BUSSES_TIMESP + " TEXT);";

    private SQLiteDatabase myDatabase;

    protected boolean isOpened = false;

    private MyDatabaseHelper myHelper;

    public static final String LOG_TAG = "Database";

    private static class MyDatabaseHelper extends SQLiteOpenHelper
    {
        public MyDatabaseHelper(Context context)
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL(CREATE_SQL);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_BUSSES);
            onCreate(db);
        }
    }

    public MyDatabase(Context context)
    {
        myHelper = new MyDatabaseHelper(context);
    }

    public MyDatabase openDB() throws SQLException
    {
        isOpened = true;

        myDatabase = myHelper.getWritableDatabase();

        return this;
    }

    public void closeDB()
    {
        isOpened = false;

        myHelper.close();
    }

    public SQLiteDatabase getDatabase()
    {
        return myDatabase;
    }

    @Override
    public boolean addOrUpdate(Bus entry)
    {
        /* Result flag */
        boolean result = true;

        /* If the database is not opened, open it */
        if(!isOpened)
        {
            openDB();
        }

        /* Set the row */
        ContentValues values = new ContentValues();
        values.put(KEY_BUSSES_NUMBER, entry.getNumber());
        values.put(KEY_BUSSES_SOURCE, entry.getSource());
        values.put(KEY_BUSSES_DESTINATION, entry.getDestination());
        values.put(KEY_BUSSES_ROUTE, (entry.getRoute() != null ? entry.getRoute() : ""));
        values.put(KEY_BUSSES_ISSTARRED, (entry.isStarred() ? 1 : 0));
        values.put(KEY_BUSSES_TIMESH, (entry.getTimesH() != null ? new Gson().toJson(entry.getTimesH()) : ""));
        values.put(KEY_BUSSES_TIMESC, (entry.getTimesC() != null ? new Gson().toJson(entry.getTimesC()) : ""));
        values.put(KEY_BUSSES_TIMESP, (entry.getTimesP() != null ? new Gson().toJson(entry.getTimesP()) : ""));

        try
        {
            /* Check if the entry is already in the database */
            int temp = get(entry);
            if(temp != -1 && temp == entry.getNumber())
            {
                /* Updating */
                getDatabase().update(TABLE_NAME_BUSSES, values, KEY_BUSSES_NUMBER + "=" + entry.getNumber(), null);
            }
            else
            {
                /* Adding */
                getDatabase().insert(TABLE_NAME_BUSSES, null, values);
            }
        }
        catch(Exception e)
        {
            Log.e(LOG_TAG, "Error occurred while adding to/updating database!", e);

            result = false;
        }

        /* If the database is opened, close it */
        if(isOpened)
        {
            closeDB();
        }

        /* Return the result */
        return result;
    }

    @Override
    public int get(Bus entry)
    {
        /* Resulting number */
        int number = -1;

        /* If the database is not opened, open it */
        if(!isOpened)
        {
            openDB();
        }

        /* Column to select which is just number */
        String[] columns = new String[]
        {
            KEY_BUSSES_NUMBER
        };

        /* Cursor to query the database */
        Cursor cursor = getDatabase().query(TABLE_NAME_BUSSES, columns,
                                            KEY_BUSSES_SOURCE + "=" + (entry.getSource() != null ? "\"" + entry.getSource() + "\"" : "NULL") + " AND " +
                                            KEY_BUSSES_DESTINATION + "=" + (entry.getDestination() != null ? "\"" + entry.getDestination() + "\"" : "NULL") + " AND " +
                                            KEY_BUSSES_ROUTE + "=" + (entry.getRoute() != null ? "\"" + entry.getRoute() + "\"" : "NULL") + " AND " +
                                            KEY_BUSSES_ISSTARRED + "=" + (entry.isStarred() ? 1 : 0) + " AND " +
                                            KEY_BUSSES_TIMESH + "=" + (new Gson().toJson(entry.getTimesH()) != null ? "\"" + new Gson().toJson(entry.getTimesH()) + "\"" : "NULL") + " AND " +
                                            KEY_BUSSES_TIMESC + "=" + (new Gson().toJson(entry.getTimesC()) != null ? "\"" + new Gson().toJson(entry.getTimesC()) + "\"" : "NULL") + " AND " +
                                            KEY_BUSSES_TIMESP + "=" + (new Gson().toJson(entry.getTimesP()) != null ? "\"" + new Gson().toJson(entry.getTimesP()) + "\"" : "NULL"),
                                            null, null, null, null);

        /* If successfully queried */
        if(cursor != null)
        {
            /* If any match is found */
            if(cursor.getCount() > 0)
            {
                /* Go to the first match */
                cursor.moveToFirst();

                /* Set the resulting number */
                number = cursor.getInt(cursor.getColumnIndex(KEY_BUSSES_NUMBER));
            }
        }

        /* If the database is opened, close it */
        if(isOpened)
        {
            closeDB();
        }

        /* Return the result */
        return number;
    }
}
公共类MyDatabase实现IDatabaseOperations
{
公共静态最终字符串键\u总线\u NUMBER=“总线号”;
公共静态最终字符串键\u BUSSES\u SOURCE=“busSource”;
公共静态最终字符串键\u总线\u DESTINATION=“总线目的地”;
公共静态最终字符串键\u总线\u路由=“总线路由”;
公共静态最终字符串键\u BUSSES\u ISSTARRED=“bussistarred”;
公共静态最终字符串键\u BUSSES\u TIMESH=“bastimesh”;
公共静态最终字符串键\u总线\u TIMESC=“bastimesc”;
公共静态最终字符串键\u总线\u TIMESP=“bastimesp”;
私有静态最终字符串数据库\u NAME=“DATABASE”;
私有静态最终int数据库_VERSION=1;
私有静态最终字符串表\u NAME\u BUSSES=“BUSSES”;
私有静态最终字符串CREATE_SQL=“CREATE TABLE”+表名\u总线+”(“
+密钥\u总线\u编号+“整数主键不为空,”
+键\u总线\u源+“文本不为空,”
+键\u总线\u目的地+“文本不为空,”
+按键\总线\路由+“文本,”
+键为“\u总线”\u Istarred+“文本不为空,”
+按键\u总线\u TIMESH+“文本,”
+按键\u总线\u时间C+“文本,”
+按键_总线_TIMESP+“TEXT);”;
私有SQLiteDatabase-myDatabase;
受保护的布尔值为假;
私有MyDatabaseHelper myHelper;
公共静态最终字符串LOG_TAG=“Database”;
私有静态类MyDatabaseHelper扩展了SQLiteOpenHelper
{
公共MyDatabaseHelper(上下文)
{
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db)
{
db.execSQL(创建SQL);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion)
{
db.execSQL(“如果存在删除表”+表名\u总线);
onCreate(db);
}
}
公共MyDatabase(上下文)
{
myHelper=新的MyDatabaseHelper(上下文);
}
公共MyDatabase openDB()引发SQLException
{
等间距=真;
myDatabase=myHelper.getWritableDatabase();
归还这个;
}
公共数据库()
{
等间距=假;
myHelper.close();
}
公共SQLiteDatabase getDatabase()
{
返回myDatabase;
}
@凌驾
公共布尔地址更新(总线条目)
{
/*结果标志*/
布尔结果=真;
/*如果数据库未打开,请将其打开*/
如果(!等间距)
{
openDB();
}
/*挑起争端*/
ContentValues=新的ContentValues();
value.put(KEY_BUSSES_NUMBER,entry.getNumber());
value.put(KEY_BUSSES_SOURCE,entry.getSource());
value.put(KEY_BUSSES_DESTINATION,entry.getDestination());
value.put(KEY_BUSSES_ROUTE,(entry.getRoute()!=null?entry.getRoute():“”);
value.put(KEY_BUSSES_isstared,(entry.isstared()?1:0));
value.put(KEY_BUSSES_TIMESH,(entry.getTimesH()!=null?new Gson().toJson(entry.getTimesH()):“”);
value.put(KEY_BUSSES_TIMESC,(entry.getTimesC()!=null?new Gson().toJson(entry.getTimesC()):“”);
value.put(KEY_BUSSES_TIMESP,(entry.getTimesP()!=null?new Gson().toJson(entry.getTimesP()):“”);
尝试
{
/*检查该条目是否已在数据库中*/
int temp=获取(输入);
if(temp!=-1&&temp==entry.getNumber())
{
/*更新*/
getDatabase().update(表名、值、键号+“=”+条目.getNumber(),null);
}
其他的
{
/*添加*/
getDatabase().insert(表名、null、值);
}
}
捕获(例外e)
{
e(Log_标记,“添加/更新数据库时出错!”,e);
结果=假;
}
/*如果数据库已打开,请将其关闭*/
如果(等参线)
{
closeDB();
}
/*返回结果*/
返回结果;
}
@凌驾
公共int get(公共汽车入口)
{
/*结果数*/
整数=-1;
/*如果数据库未打开,请将其打开*/
如果(!等间距)
{
openDB();
}
/*列来选择哪一个只是数字*/
字符串[]列=新字符串[]
{
键号
};
/*游标来查询数据库*/
Cursor Cursor=getDatabase().query(表名、列、,
键\u BUSSES\u SOURCE+“=”+(entry.getSource()!=null?”\“”+entry.getSource()+“\”“:“null”)+“和”+
键\u总线\u DESTINATION+“=”+(entry.getDestination()!=null?\”+entry.getDestination()+“\”:“null”)+