如何在辅助类中使用SQLiteOpenHelper?

时间:2015-11-07 03:44:44

标签: android class this sqliteopenhelper

作为一名新的Android程序员,我按照各种在线示例创建了自己的类,扩展了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();

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

进行一些在线搜索我认为我理解我需要从应用程序(或调用活动??)获取Context,但不知道如何使用此代码执行此操作。

正如我所提到的,我是Android新手...所以任何代码示例都会非常感激。

修改

我需要澄清如上所述的这个二级课程。从上述在线示例中,第二类用于“保持”数据库记录信息。它看起来像这样......

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;
    }
    ...

这通常在活动中使用这样的东西......

MySQLiteHelper db = new MySQLiteHelper(this);
Acct acct = new Acct();
acct=db.getAccount(searchId);
myEditText.setText(acct.get_name());
...

我的问题出现了,我想创建一个例程并在Acct类中对其进行编码,以便可以引用它...例如...

acct.UpdateData();

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

更糟糕的是,因为Acct类是来自数据库的数据的“保留”位置,所以在getAccount例程期间,在线示例也使用Acct IN'MySQLiteHelper'.... / p>

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;
}

我希望所有这些额外的内容有助于澄清我到目前为止发布的几个评论和答案我想要做些什么。如果您需要更多信息,请询问。我想让这个工作,但仍然不确定如何。

2 个答案:

答案 0 :(得分:1)

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

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

public class Foo {
    private MyOpenHelper openHelper;

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

如果Foo是单例,则可以通过获取实例的任何方法执行相同的操作(即强制调用者提供上下文)。每个应用程序组件都是Context(活动,服务)或具有Context(BroadcastReceiver在onReceive()中获取一个,ContentProvider具有getContext())。

在这里使用getApplicationContext()值得注意:应用程序的Application对象始终是一个单例 - 只要您的应用程序正在运行,它就会存在一个实例(这是由操作系统保证的) )。活动可能会被破坏,创建一个MySQLiteHelper会导致内存泄漏。应用程序上下文始终存在,因此不会泄露。

答案 1 :(得分:0)

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

希望这有帮助!