Android 尝试访问数据时尝试调用虚拟方法错误
我是android世界的新手,当我试图从数据库获取数据时,我遇到了这个错误,下面是我的数据库访问代码Android 尝试访问数据时尝试调用虚拟方法错误,android,Android,我是android世界的新手,当我试图从数据库获取数据时,我遇到了这个错误,下面是我的数据库访问代码 public static boolean Checkduplicate(String activity_name, String location, String date) { SQLiteDatabase dtb = ActivityHandler.db; String Query = "Select * from Activity where activity_nam
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;
}
这是我的完整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;
}
公共类ActivityHandler{
私有静态数据库;
公共活动处理程序(上下文){
DatabaseHandler dbDatabaseHandler=新的DatabaseHandler(上下文);
this.db=dbDatabaseHandler.getWritableDatabase();
}
@凌驾
受保护的void finalize()抛出可丢弃的{
试一试{
db.close();
}捕获(例外情况除外){
}
super.finalize();
}
公共静态布尔检查重复(字符串活动名称、字符串位置、字符串日期){
SQLiteDatabase dtb=ActivityHandler.db;
String Query=“从活动中选择*,其中活动名称=“+Activity\u name+”和位置=“+location+”和日期=“+date”;
Cursor Cursor=dtb.rawQuery(查询,空);
if(cursor.getCount()您需要了解静态
的含义以及Java垃圾收集器的工作原理。
您正在为对象构造函数中的static
属性赋值。这意味着两件事:
1) 您需要首先创建ActivityHandler的对象。它将使用值初始化属性db
。
2) 您需要在某处保留对此对象的引用。如果您不保留引用,对象将被垃圾收集,这将调用finalize()
并关闭数据库。
我建议如下:
1) 删除关键字static
,并将ActivityHandler的对象传递给方法
2) 仔细阅读一些基本的Java书籍,如核心Java、有效Java等。我认为您应该删除static并编写此=>
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;
}
我已经读过这个主题,但找不到我的案例的解决方案我不擅长java,但似乎dtb
是null
,可能是因为ActivityHandler.db
也是null
。重复的内容适用。只要读一下错误消息。@Jean Françoisfare我也不擅长java,但如果dtb是null,那不是r在“dtb.rawQuery”行中断后,调试器检查立即显示错误?您提到的那一行是导致错误的那一行。在null对象上调用方法。您对java的吮吸比我的更大:)但是如果我删除static关键字,我无法在另一个类中调用该方法。是的,您可以。您必须创建Ac的新实例tivityHandler,然后从此实例调用Checkduplicate。
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);