【问题标题】:Calling function from another activity从另一个活动调用函数
【发布时间】:2014-01-18 13:48:00
【问题描述】:

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

时钟脚本:

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();数据.createTable();我得到一个 NullPointerException。

这里有什么问题?

【问题讨论】:

  • 将数据类声明为静态
  • 查看link

标签: java android function android-activity static


【解决方案1】:

将静态关键字添加到您的共享方法中

public static void createTable()

然后使用:

Data.createTable();

在另一个类/片段/活动中的某个地方。

我这样做了,它有效。

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

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

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

【讨论】:

  • 我试过这个,但它给我的 SQLiteDatebase 中的函数带来了很多错误,例如:'不能对非静态方法 openOrCreateDatabase(String, int, SQLiteDatabase. CursorFactory) 来自 ContextWrapper' 类型。有什么想法吗?
  • 是的,像openOrCreateDatabase()这样的方法是指活动上下文,所以你可以在共​​享方法中添加额外的参数上下文,并从传递当前活动上下文的其他活动中调用它。
  • 啊伙计,这太酷了。真的和我的很相似 :P 你能告诉我你是如何设置你的包含 TableCreate 函数的类的吗?因为我仍然遇到错误,我认为这就是原因。
  • 查看我编辑的答案。我认为现在您已经拥有了相应地修改代码并开始享受您的数据库所需的一切;)
  • 干杯,我终于弄清楚我的数据库出了什么问题。当我不应该的时候,我一直在放下桌子。感谢您的帮助:)
【解决方案2】:

我会在一个单例http://en.wikipedia.org/wiki/Singleton_pattern 中拥有所有与数据库相关的方法。 我会将上下文发送给那个单例,或者只是静态方法。

我不认为有一个数据库管理员的活动是个好主意。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我一直在关注这个问题,并根据 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 类的类中发现的所有其他内容,因为我只是想展示我从其他类调用函数的操作。 这个解决方案对我来说是完美的。可能对其他人有用也可能没用

      【讨论】:

        猜你喜欢
        • 2019-02-13
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多