方法为SQL和ListActivity调用(静态到非静态)

时间:2010-12-26 23:01:37

标签: android sqlite

我已经在网上阅读了大量帖子,看到很多人想要做同样的事情,所有帖子都指的是需要做像Singleton这样的事情或使用繁琐的conext例程。为什么访问数据库包装类比访问任何其他活动更困难(这很简单)?从其他活动访问其他活动我没有问题 - 我一定在课堂上小睡 - 我错过了什么?

以下是背景资料:

Maincode使用One Button调出主布局。

Button 调用DB Wapper类(称为DB_Interface,它有一个带按钮的布局来执行我想要的数据库。主要的数据库内容在助手中定义 - 我称之为DBHelp_mate)。

在不使用Maincode的情况下,我可以运行应用程序(使用DB_Interface作为主要活动)并且它可以正常运行但是,只要我使用主编码调用DB_Interface,按下按钮就会崩溃。

是的 - 我已正确更改了清单文件以反映哪个活动是主要活动以及宣布其他活动(这不是火箭科学 - 而且,真的,我是一名火箭科学家!)。

所以,我的问题是:如何从Maincode调用DB_Interface并让它调用DBHelp_mate并工作?

谢谢 - 新代码是一个跟随(没有DBHelp_mate中的内容,不应该影响您的指导)。请提供具体的电话/代码,而不是说“你需要实例化。这个和那个” - 这只会造成更多的混乱和许多回复/重新发布。

新代码:

public class Maincode extends Activity { 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button goToDB = (Button) findViewById(R.id.Button01);
    //  ---------------------------------------------------------
    goToDB.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        Intent doIt = new Intent();
        doIt.setClassName("com.bt.hopex", "com.bt.hopex.DB_Interface");
        startActivity(doIt);
      }
    }); // end -----------------------------------------------   
  }//end onCreate 
}//end activity

DB_INTERFACE

  public class DB_Interface extends Activity { 
  private DBHelp_mate ddbb;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.db_dialog);       
        ddbb = new DBHelp_mate(this);
        ddbb.open();       
    }//end onCreate
}//end activity 

DBHelp队友

public class DBHelp_mate {

  private DatabaseHelper dbHelper ;
  private SQLiteDatabase db;

  private Context mCtx = null;

  //*******************************************************
  private static final String DATABASE_NAME = "XgAlert_db";
  private static final String DATABASE_TABLE = "tblData";
  private static final int    DATABASE_VERSION = 2;
  private static final String DATABASE_CREATE =
      "create table gAlert_alerts ( "
      + "_id integer primary key autoincrement, "
      + "alert_text text not null,"
      + "alert_date varchar(20) not null,"
      + "alert_time varchar(20) not null"
      +");";

   //-------------------------------------------------------------
  private static class DatabaseHelper extends SQLiteOpenHelper {
    DatabaseHelper(Context ctx) {
      super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
      db.execSQL(DATABASE_CREATE);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
      db.execSQL("DROP IF TABLE EXISTS "+ DATABASE_TABLE); change drop to alter later after all is working!
      onCreate(db);
    }
  }

  public DBHelp_mate(Context ctx) {
    mCtx = ctx;
  }
  //********************************************************

  public DBHelp_mate open () throws SQLException {
    dbHelper = new DatabaseHelper(mCtx);
    db = dbHelper.getWritableDatabase();
    return this;
  }
  //------------------------------------------------------------
  /** Closes a database connection */
  public void close() {
    dbHelper.close();
  }    
  //------------------------------------------------------------

3 个答案:

答案 0 :(得分:2)

  

鉴于我无法将非静态方法更改为静态,如何从其他活动中调用此方法?

你没有。您重构代码,以便可以从需要它的所有活动访问您的数据模型。

答案 1 :(得分:1)

问题是你必须创建一个类OptPanel的实例,比如

OptPanel myOptPanel = new OptPanel();

只有这样,您才能访问方法showRecords()并将myOptPanel作为参数提供给另一个活动(如构造函数)。

public class MyActivity
{
    private OptPanel _optPanel;

    public MyActivity(OptPanel myOptPanel)
    {
        this._optPanel = myOptPanel;
    }

    public void showRecordsInActivity()
    {
        this._optPanel.showRecords(null);
    }
}

如果你写

MyClass.myStaticClassMethod();

您只能访问静态成员。

如果你写

MyClass theClass = new MyClass();
theClass.MyObjectMethod();

您可以访问对象成员。

这是常见的OOP语法。

答案 2 :(得分:0)

<强>解决

经过多年的挣扎,我买了一本书 - Android for Dummies, Bingo ,如何把它埋在书中。对于那些对如何操作感兴趣的人,请阅读本书的相关部分。