从另一个活动中调用函数

时间:2014-01-18 13:48:01

标签: java android function android-activity static

我有一个活动,其中包含控制我的数据库的所有函数,我希望在与数据库交互时所有其他活动都用于这些函数。以下是我的问题的一个例子。

时钟脚本:

public class Clock extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clock);

        Data.createTable(); //<<<
    }
        //...
}

数据脚本:

public class Data extends Activity
{
    SQLiteDatabase mydb;
    private static String DBNAME = "SHIFTS.db";
    private static String TABLE = "MY_SHIFTS"; 

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data);
    }   

    public void createTable() //<<<
    {
        try
        {
            mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
            mydb.execSQL("CREATE TABLE IF  NOT EXISTS "+ TABLE +" (ID INTEGER PRIMARY KEY, STARTDATE TEXT, ENDDATE TEXT, LENGTH INTEGER, TYPE INTEGER);");
            mydb.close();
        }
        catch(Exception e)
        {
            Toast.makeText(getApplicationContext(), "Error in creating table", Toast.LENGTH_LONG).show();
        }
    }
    // ... lots more functions
}

错误讯息:

  

无法对非静态方法createTable()进行静态引用   来自数据类型。

当我尝试使方法静态时,它只会导致更多问题。

另外,如果我尝试Data data = new Data(); data.createTable();我得到一个NullPointerException。

这里有什么问题?

4 个答案:

答案 0 :(得分:12)

将static关键字添加到共享方法

public static void createTable()

然后使用:

Data.createTable();

在另一个Class / Fragment / Activity中的某个地方。

我这样做并且有效。

好吧,我的“数据”是一个普通的类,而不是一个Activity,但我也有一个带有共享方法的Activity,方法相同。

这是我的dbTableCreate方法:

// Create the database table if it doesn't exist
protected final static void dbTableCreate(final Context ctx)
{
    SQLiteDatabase db = null;
    try
    {
        db = ctx.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
        db.execSQL
        (
            "CREATE TABLE IF NOT EXISTS " + DB_TABLE +
            " (date DATETIME PRIMARY KEY NOT NULL DEFAULT (CURRENT_DATE), " +
            "score INTEGER DEFAULT (null));"
        );
    }
    catch (final SQLiteException se)
    {
        System.out.println
        (
            ctx.getClass().getSimpleName() + "\n" +
                "Could not create the database"
        );
        se.printStackTrace();
    }
    finally
    {
        db.close();
    }
}

我称之为:

Context ctx = getApplicationContext();
CLS_DB.dbTableCreate(ctx);

我和你的班级之间的主要区别在于我的班级被宣布为

public final class CLS_DB
{
    /* ----------------------------- Constants ------------------------------ */

    private final static String DB_NAME = "pat.db";
    private final static String DB_TABLE = "tests";

    /* ------------------------------ Methods ------------------------------- */

而不是活动。
我没有初始化类,它没有构造函数 它只是一个共享的bin(而不是用于执行我的代码中其他任何地方都没有看到的操作)方法。

答案 1 :(得分:2)

我会在单个http://en.wikipedia.org/wiki/Singleton_pattern中拥有所有与DB相关的方法。 我会将上下文发送给该单例,或者仅发送静态方法。

我认为将活动作为数据库管理员并不是一个好主意。

答案 2 :(得分:0)

使用java标准的最佳方法是make Singleton类Database.Put此类中的所有这些共享方法。应用程序中的所有活动都将使用此Singleton类执行数据库操作。

答案 3 :(得分:-2)

我正在关注这个问题并根据Android_Dev的回答我对我的代码进行了更改,如下所示

第一堂课

 class blah extends activity {
 //// onCreate , initialization etc here

     public void sss(context c)
   {

    Toast(c , "text" , toast.LENTGH_LONG) ;

   }

  }

第二课

public xxxx extends activity
{

Context c = getApplicationContext();
blah b = new blah(this) ;

 /// inside an onclicklistener attached to a button object, i put this
    b.sss(c) ; 

}

我没有包含通常在扩展Activity类的类中找到的所有其他东西,因为我只想展示我从其他类调用函数所做的事情。 这个解决方案非常适合我。虽然

可能对其他人有用或可能没用