Android:getContext()错误

时间:2017-03-04 16:49:41

标签: android android-context

我只是一个简单的错误,但我真的很难解决这个问题。为什么getContext()未应用?

 public void ClearRecentPlayer() {

        mDbHelper = new DataConn(getContext()); //<---getContext() in redline(not applied)
        SQLiteDatabase db = mDbHelper.getWritableDatabase();

        ContentValues v = new ContentValues();
        v.put(FeedReaderContract.FeedEntry.COLUMN_NAME_STATS, 0);

        String selection = FeedReaderContract.FeedEntry.COLUMN_NAME_STATS + " = ?";
        String[] selectionArgs = { "0" };
        int c = db.update(
                FeedReaderContract.FeedEntry.TABLE_NAME_PLAYER,
                v,
                selection,
                selectionArgs);
    }

并且有了......

public class DataConn extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "db_egame.db";

    DataConn mDbHelper;

    public DataConn(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_EASY_ENTRIES);
        db.execSQL(SQL_CREATE_HARD_ENTRIES);
        db.execSQL(SQL_CREATE_DIFF_ENTRIES);
        db.execSQL(SQL_CREATE_PLAYER_ENTRIES);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(SQL_DELETE_EASY_ENTRIES);
        db.execSQL(SQL_DELETE_HARD_ENTRIES);
        db.execSQL(SQL_DELETE_DIFF_ENTRIES);
        db.execSQL(SQL_DELETE_PLAYER_ENTRIES);
        onCreate(db);
    }

    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
        onCreate(db);
    }

3 个答案:

答案 0 :(得分:2)

如此处所述(https://stackoverflow.com/a/10641257/2319627

  

View.getContext():返回视图当前的上下文   运行。通常是当前活动的活动。

     

Activity.getApplicationContext():返回的上下文   整个应用程序(所有活动都在里面运行的过程)   的)。如果需要,请使用此代替当前的Activity上下文   上下文绑定到整个应用程序的生命周期,而不仅仅是   当前活动。

     

ContextWrapper.getBaseContext():如果您需要访问上下文   在另一个上下文中,您使用ContextWrapper。上下文   从内部引用ContextWrapper是通过访问   getBaseContext。

因此,当您尝试使用DataBaseHelper时,最好使用getApplicationContext()

并且,您可以仅从活动或服务中调用getApplicationContext,或从上下文实例调用activity.getApplicationContext()。与ClearRecentPlayer

一样

您需要数据库助手类的应用程序上下文。因此,在初始化

时将上下文传递给数据库

ClearRecentPlayer方法是否在活动中?否则,您必须将应用程序上下文传递给您调用.Context方法的类。

您可以在该课程中创建成员变量ClearRecentPlayer,也可以将ClearRecentPlayer (Context context)方法称为u.user

答案 1 :(得分:2)

getContext()只是View的可用方法。

如果您的方法在该数据库类中,则实际上并不需要Context。或者在其自己的类中的任何DataConn实例。

public class DataConn extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "db_egame.db";

    private Context mContext;

    public DataConn(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.mContext = context;
    }


    public void clearRecentPlayer() {

        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues v = new ContentValues();
        v.put(FeedReaderContract.FeedEntry.COLUMN_NAME_STATS, 0);

        String selection = FeedReaderContract.FeedEntry.COLUMN_NAME_STATS + " = ?";
        String[] selectionArgs = { "0" };
        int c = db.update(
            FeedReaderContract.FeedEntry.TABLE_NAME_PLAYER,
            v,
            selection,
            selectionArgs);
    }

答案 2 :(得分:1)

为activity / AppCompactActivity尝试 getApplicationContext()而不是 getContext()