从另一个活动调用函数

4

我有一个包含控制我的数据库的所有功能的活动,我希望所有其他活动在与数据库交互时使用这些功能。以下是我的问题示例。

时钟脚本:

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
}

错误信息:

无法对类型Data中的非静态方法createTable()进行静态引用。

当我尝试将方法设为静态时,会导致更多问题。

如果我尝试使用Data data = new Data(); data.createTable();,则会出现NullPointerException。

这里的问题是什么?


将数据类声明为静态。 - user2511882
点击这个链接 - amalBit
4个回答

13
将静态关键字添加到您的共享方法中。
public static void createTable()

然后使用:

Data.createTable();

在另一个类/片段/活动中。

我这样做了,它起作用了。

我的“Data”是一个普通的类,不是一个活动,但我也有一个活动以同样的方式共享方法。

这是我的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 ------------------------------- */

并非作为Activity使用。
我没有初始化该类,并且它没有构造函数。
它只是一组共享的(不仅如此,还可以执行在我的代码中没有看到的操作)方法。


1
我尝试了这个,但是它在我的SQLite数据库中的函数方面给出了大量错误,例如:'无法对类型ContextWrapper中的非静态方法openOrCreateDatabase(String、int、SQLiteDatabase.CursorFactory)进行静态引用'。有什么想法吗? - Magnus
是的,像openOrCreateDatabase()这样的方法涉及到活动上下文,因此您可以向共享方法添加额外的参数上下文,并从其他活动调用它,传递当前活动上下文。 - Swapnil
哇,这太酷了。跟我的很相似 :P 你能给我展示一下你是如何设置包含TableCreate函数的类吗?因为我仍然在遇到错误,我想那可能就是原因。 - Magnus
看看我编辑过的答案。我认为现在你已经有了修改代码并开始享受数据库的一切所需的一切 ;) - Phantômaxx
1
谢谢,伙计。我终于弄清楚我的数据库出了什么问题了。我一直在删除表格,但其实不应该这样做。感谢你的帮助 :) - Magnus

2
我建议将所有与数据库相关的方法放在单例模式 http://en.wikipedia.org/wiki/Singleton_pattern 中。可以将上下文发送到该单例,或者使用静态方法。
我认为将活动作为数据库管理器不是一个好主意。

0

使用Java标准的最佳方法是创建单例类Database。将所有共享方法放在这个类中。您应用程序中的所有活动都将使用此单例类执行数据库操作。


-1
我正在关注这个问题,并根据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类的所有其他通常发现的东西,因为我只想展示我从其他类中调用函数所做的事情。 这个解决方案对我来说非常完美。虽然可能对其他人没有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接