非Activity类中获取Android上下文(context)

3
在我的SQLite设置类中,我有一个需要上下文作为其中一部分的DbHelper。为了设置上下文,我只需在我的SQLite类中使用一个需要上下文作为其参数之一的构造函数。
但是,我遇到了一个问题。当尝试从不是Activity的类中调用我的SQLite类时,我无法使用作为context classname.this,这让我很困扰。
我还尝试通过以下方式声明上下文:
protected Context context;

然后稍后可以像这样调用它:
SetSql PlayerObject = new SetSql(This.context);

但这也没有起作用。 有什么建议吗?

https://dev59.com/3Gkw5IYBdhLWcg3wrsdS#9725458 - Samir Mangroliya
我尝试了,但是出现了“在范围内无法访问Activity类型的封闭实例”的错误。 - arielschon12
1
在我看来,你应该始终传递一个应用程序而不是活动上下文给这些类型的东西。 - Phix
2个回答

6

像这样传递应用程序上下文

SetSql PlayerObject = new SetSql(this.getApplicationContext());

现在它应该可以正常工作了。


我认为这不会起作用,因为我的类不是Activity,正如我所提到的,并且它没有在清单文件中设置。我尝试了一下,它说方法getApplicationContext()对于RandPlayers(我的类)未定义。如果需要,我该如何在清单文件中设置它? - arielschon12
1
创建一个静态全局变量 static Context appContext; 并在 appContext 中分配应用程序上下文。在 main activityonCreate() 方法中,appContext=getApplicationContext();。现在在非活动类中访问它。 new SetSql(MainActivity.appContext); - Ravi1187342
通过“主活动”,您是指最先启动的活动吗?那将是我的闪屏活动。这是您的意思吗? - arielschon12
是的,您可以在启动活动中创建一个静态全局Context变量,并将ApplicationContext存储在该变量中。 - Ravi1187342
哈,你美丽的生物。如果使用不当,这种方法可能会导致内存泄漏,但仍然是一个不错的解决方法。 - vergil corleone

-1
public class DBHelper extends SQLiteOpenHelper {

private static final String TAG = "DBHelper";
private static final int DB_VERSION = 1;

private Context context;
private String DB_PATH;
private String DB_NAME;
private String TABLE_NAME;
private boolean booCreate;
private String createString;
private SQLiteDatabase myDataBase;

public DBHelper(Context context, String db_name, String table_name,
        boolean booCreate, String createString) {
    super(context, db_name, null, DB_VERSION);
    this.context = context;
    this.DB_NAME = db_name;
    this.DB_PATH = "/data/data/" + FindPackageName() + "/databases/";
    Log.d(TAG, "DBPATH=" + DB_PATH);
    this.TABLE_NAME = table_name;
    this.createString = createString;
    this.booCreate = booCreate;
    Log.d(TAG,"booCreate=" + String.valueOf(this.booCreate));
    try {
        createDataBase();
    } catch (IOException e) {
        throw new Error("Unable to Create Database");
    }
}

并且在你的活动中

dbHelper = new DBHelper(this, this.getString(R.string.db_name_contact),
            this.getString(R.string.table_name_contacts), true, createString);

观看此视频并从tutorial的第三部分下载代码。


我担心这段代码会改变我的应用程序中一些我无法更改的东西。你知道解决上下文问题的简单方法吗? - arielschon12

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