Java 将方法从一个类调用到另一个类

Java 将方法从一个类调用到另一个类,java,android,sqlite,Java,Android,Sqlite,我在一个类中编写了此方法,用于检查数据库中是否存在表: public boolean DoesTableExist(String tableName) { SQLiteDatabase mDatabase = openOrCreateDatabase("privdb",MODE_PRIVATE,null); Cursor cursor = mDatabase.rawQuery("select DISTINCT tbl_name from sqlite_master where

我在一个类中编写了此方法,用于检查数据库中是否存在表:

public boolean DoesTableExist(String tableName) {
    SQLiteDatabase mDatabase = openOrCreateDatabase("privdb",MODE_PRIVATE,null);

    Cursor cursor = mDatabase.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'", null);
    if(cursor!=null) {
        if(cursor.getCount()>0) {
            cursor.close();
            return true;

        }
        cursor.close();
    }

    return false;
}
我现在想在其他活动或类中调用此方法,而不必每次在每个文件中都编写相同的代码。
我该怎么做呢?

通常,您会通过实例化另一个类,然后调用该方法来调用该类中的方法。例如,如果方法所在的类名为
DatabaseUtils
,则应执行以下操作:

DatabaseUtils dbUtils = new DatabaseUtils();
boolean exists = dbUtils.doesTableExist("tablename"); 
                      // ^ note that the normal Java convention is to make
                      //   method names start with a lower case letter
boolean exists = DatabaseUtils.doesTableExist("tablename");
然而,这有一种“实用”方法的感觉(对象可能不存储任何状态,因此不需要实例化它),处理这些的常用方法是使方法静态,如下所示:

public static boolean doesTableExist(String tableName) {
这将导致该方法存在于类定义本身上,而不是类的特定实例上,并允许您执行以下操作:

DatabaseUtils dbUtils = new DatabaseUtils();
boolean exists = dbUtils.doesTableExist("tablename"); 
                      // ^ note that the normal Java convention is to make
                      //   method names start with a lower case letter
boolean exists = DatabaseUtils.doesTableExist("tablename");

创建该方法所在的类的实例,创建一个get方法并通过该实例调用该方法。 另一种选择是将方法定义为静态方法,并以这种方式调用它

实例:

ClassName classInstance = new ClassName();
classInstance.getMethod(parametar);
静态:

ClassName.methodName(parametar);
以下是关于这方面的更多信息:

将其放入“utils”包中是一个不错的选择。 创建一个名为“utils”的新Java包,添加一个新类,如“DatabaseUtils.Java”,并使其看起来像这样:

    public class DatabaseUtils {

    public boolean DoesTableExist(String tableName) {
                SQLiteDatabase mDatabase = openOrCreateDatabase("privdb",MODE_PRIVATE,null);

                Cursor cursor = mDatabase.rawQuery("select DISTINCT tbl_name from sqlite_master                 where tbl_name = '"+tableName+"'", null);
                if(cursor!=null) {
                    if(cursor.getCount()>0) {
                        cursor.close();
                        return true;
                    }
                    cursor.close();
                }
                return false;
            }

    }
    public class main {

            public static void main(String [] args)
                    boolean isTableExisting = DatabaseUtils.doesTableExist("yourTableName")
                    System.out.println("Table existing? " + isTableExisting);
            }
    }
现在,您可以从其他地方引用它,例如:

    public class DatabaseUtils {

    public boolean DoesTableExist(String tableName) {
                SQLiteDatabase mDatabase = openOrCreateDatabase("privdb",MODE_PRIVATE,null);

                Cursor cursor = mDatabase.rawQuery("select DISTINCT tbl_name from sqlite_master                 where tbl_name = '"+tableName+"'", null);
                if(cursor!=null) {
                    if(cursor.getCount()>0) {
                        cursor.close();
                        return true;
                    }
                    cursor.close();
                }
                return false;
            }

    }
    public class main {

            public static void main(String [] args)
                    boolean isTableExisting = DatabaseUtils.doesTableExist("yourTableName")
                    System.out.println("Table existing? " + isTableExisting);
            }
    }
您可能还需要传递数据库的名称(“privdb”)或方法“openOrCreateDatabase(…)”所在的引用


当您的数据库确实存在时,它将打印
“Table existing?true”

,这是一个非常好的答案,谢谢。还有一个问题:从另一个类调用此方法会给我一个空指针:java.lang.NullPointerException:尝试调用虚拟方法“android.database.sqlite.SQLiteDatabase android.content.openOrCreateDatabase”(java.lang.String,int,android.database.sqlite.SQLiteDatabase$CursorFactory)'在空对象引用上-如果该表不存在,在我的类中直接调用它时,它会给我一个“false”作为布尔值。这听起来太错误了,我甚至不知道我是怎么写给你的,但我不明白为什么会发生这种情况为什么在这个方法/类中不可能使用MODE_PRIVATE,相反,我必须像这样在ErrorHandler和FactoryCursor上加上“null”:SQLiteDatabase mDatabase=SQLiteDatabase.openOrCreateDatabase(“privdb”,null,null)?