如何在辅助 class 中使用 SQLiteOpenHelper?

How do I use SQLiteOpenHelper in a secondary class?

作为一名新的 Android 程序员,我按照各种在线示例创建了我自己的 class 扩展 SQLiteOpenHelper...

public class MySQLiteHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION=1;
private static final String DATABASE_NAME="MyDB";

// Main Database Operations
public MySQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_A);
    db.execSQL(CREATE_TABLE_B);
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
...

public long addRecord(){
    SQLiteDatabase db = this.getWritableDatabase();
....

etc

这适用于我的各种活动,没有任何问题。当我想使用它时,我调用...

    MySQLiteHelper db = new MySQLiteHelper(this);

然后我调用各种例程,例如...

db.addRecord();

现在我已经创建了一个我需要在整个应用程序中使用的辅助 class。在那个class中,有一些例程需要处理来自数据库的数据。问题是,由于 this 出错,我无法声明 MySQLiteHelper。

进行一些在线搜索我想我知道我需要从应用程序(或调用 activity??)中获取上下文,但不确定如何使用此代码执行此操作。

正如我提到的,我是 Android 的新手...所以任何代码示例将不胜感激。

编辑

我需要澄清这个次要问题 class 如上所述。从前述的网上例子来看,第二个class是用来"hold"数据库记录信息的。看起来像这样...

public class Acct {
    private int     _id;
    private String  _name;
    private String  _phone;

    public Acct() {
    }

    public int get_id(){
        return this._id;
    }
    public void set_id(int id) {
        this._id=id;
    }

    public void set_name(String name){
        this._name=name;
    }
    public String get_name(){
        return this._name;
    }

    public void set_phone(String phone){
        this._name=phone;
    }
    public String get_phone(){
        return this._phone;
    }
    ...

这通常在 activity...

中与类似的东西一起使用
MySQLiteHelper db = new MySQLiteHelper(this);
Acct acct = new Acct();
acct=db.getAccount(searchId);
myEditText.setText(acct.get_name());
...

我的问题出现的地方,我想创建一个例程并将其编码在 Acct class 中,以便它可以被引用,例如...

acct.UpdateData();

这个 UpdateData 例程是我们需要访问数据库的地方,因此需要访问 MySQLiteHelper。对于每个帐户,它需要能够进入数据库,从另一个 table 访问一些信息,进行一些处理,并将摘要存储回这个 table 以便于参考。如前所述,Acct class 中没有上下文,所以这就是我感到困惑的地方。

更糟糕的是,因为 Acct class 是数据库数据的 'holding' 位置,在线示例还在 'MySQLiteHelper' 本身中使用 Acct 'MySQLiteHelper' =20=]例程....

public Acct getAccount(int id){
    SQLiteDatabase db = this.getReadableDatabase();

    String SQL_STRING="SELECT * FROM "+ACCT_TABLE+" WHERE "+ACCT_FLD_ID+" = "+String.valueOf(id);
    Cursor cursor =
            db.rawQuery(SQL_STRING, null);

    Acct acct = new Acct();

    if (cursor!=null) {
        cursor.moveToFirst();

        acct.set_id(cursor.getInt((cursor.getColumnIndex(ACCT_FLD_ID))));

        acct.set_name(cursor.getString(cursor.getColumnIndex(ACCT_FLD_NAME)));
        acct.set_phone(cursor.getString(cursor.getColumnIndex(ACCT_FLD_PHONE)));
                    cursor.close();
    } else {
        acct = null;
    }
    db.close();
    return acct;
}

我希望所有这些额外的内容有助于阐明我正在尝试为到目前为止发布的几条评论和答案做些什么。如果您需要更多信息,请询问。我想让它工作,只是仍然不确定如何。

而不是使用 this,尝试使用 MainActivity.thisgetApplicationContext()

希望对您有所帮助!

你的问题是你需要一个Context来调用MySQLiteHelper的构造函数。您已经在 Activity(这是一个上下文)中成功地这样做了,但是现在您有一些其他的 class(我将称之为 "Foo")不是上下文并且没有。

一个快速的解决方案是让 Foo 在其构造函数中使用 Context,并像这样实例化您的 MySQLiteHelper

public class Foo {
    private MyOpenHelper openHelper;

    public Foo(Context context) {
        openHelper = new MyOpenHelper(context.getApplicationContext());
    }
}

如果Foo是一个单例,你可以在任何获取实例的方法中做同样的事情(即强制调用者提供一个上下文)。每个应用程序组件要么是一个上下文(Activity,服务),要么有一个上下文(BroadcastReceiver 在 onReceive() 中有一个,ContentProvider 在 getContext() 中有一个)。

此处 getApplicationContext() 的使用值得注意:您应用的 Application 对象始终是单例——只要您的应用是 运行 (这是由 OS) 保证的。 Activity 可以被销毁,用一个创建 MySQLiteHelper 会导致内存泄漏。应用上下文一直存在,不会泄露