尝试访问数据android时尝试调用虚方法错误

时间:2018-03-14 21:11:16

标签: android

我是android世界的新手,当我尝试从数据库中获取数据时,我遇到了这个错误,下面是我的数据库访问代码

public static boolean Checkduplicate(String activity_name, String location, String date) {
    SQLiteDatabase dtb = ActivityHandler.db;
    String Query = "Select * from  Activity  where activity_name = " + activity_name + "and location =" + location + "and _date =" + date;
    Cursor cursor = dtb.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return true;
    }
    cursor.close();
    return false;
}

这是错误

FATAL EXCEPTION: main
              Process: com.example.vinhg.comp1661_nguyengiavinh, PID: 31092
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
                  at com.example.vinhg.comp1661_nguyengiavinh.ActivityHandler.Checkduplicate(ActivityHandler.java:32)
                  at com.example.vinhg.comp1661_nguyengiavinh.MainActivity.addData(MainActivity.java:41)
                  at com.example.vinhg.comp1661_nguyengiavinh.MainActivity$1.onClick(MainActivity.java:32)
                  at android.view.View.performClick(View.java:5340)
                  at android.view.View$PerformClick.run(View.java:21610)
                  at android.os.Handler.handleCallback(Handler.java:815)
                  at android.os.Handler.dispatchMessage(Handler.java:104)
                  at android.os.Looper.loop(Looper.java:207)
                  at android.app.ActivityThread.main(ActivityThread.java:5763)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)

这是我的完整ActivityHandler类

public class ActivityHandler {
private static SQLiteDatabase db;
public  ActivityHandler(Context context){
    DatabaseHandler dbDatabaseHandler = new DatabaseHandler(context);
    this.db = dbDatabaseHandler.getWritableDatabase();
}

@Override
protected void finalize() throws Throwable {
    try{
        db.close();
    }catch (Exception ex){

    }
    super.finalize();
}

public static boolean Checkduplicate(String activity_name, String location, String date) {
    SQLiteDatabase dtb = ActivityHandler.db;
    String Query = "Select * from  Activity  where activity_name = " + activity_name + "and location =" + location + "and _date =" + date;
    Cursor cursor = dtb.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return true;
    }
    cursor.close();
    return false;
}

2 个答案:

答案 0 :(得分:0)

您需要了解static的含义以及Java垃圾收集器的工作原理。 您正在为对象构造函数中的static属性赋值。这意味着两件事:
1)您需要首先创建ActivityHandler的对象。它将使用值初始化属性db
2)您需要在某处继续引用此对象。如果你不保留引用,对象将被垃圾收集,它将调用finalize()并关闭db。

我建议遵循:
1)删除关键字static,并将ActivityHandler的对象传递给方法
2)仔细阅读一些基本的Java书籍,如Core Java,Effective Java等。

答案 1 :(得分:0)

我认为你应该删除静态并写下这个=&gt;

public class ActivityHandler {
private SQLiteDatabase db;
public ActivityHandler(Context context){
    DatabaseHandler dbDatabaseHandler = new DatabaseHandler(context);
    this.db = dbDatabaseHandler.getWritableDatabase();
}

@Override
protected void finalize() throws Throwable {
    try{
        db.close();
    }catch (Exception ex){

    }
    super.finalize();
}

public boolean Checkduplicate(String activity_name, String location, String date) {
    SQLiteDatabase dtb = ActivityHandler.db;
    String Query = "Select * from  Activity  where activity_name = " + activity_name + "and location =" + location + "and _date =" + date;
    Cursor cursor = dtb.rawQuery(Query, null);
    if(cursor.getCount() <= 0){
        cursor.close();
        return true;
    }
    cursor.close();
    return false;
}

然后在另一个类中创建一个新实例并调用方法。

ActivityHandler activityHandler = new ActivityHandler(context);
boolean isDuplicate = activityHandler.Checkduplicate(activity_name,location, date);