java - 不能在静态上下文中使用 'this'

标签 java android

<分区>

我的目标是拥有一个包含所有函数的类,这些函数可以干净整洁地执行数据库操作——也可以用一行代码调用,例如; DbFunctions.AddContact("fName", "lName");

我有一个在教程中阅读过的 DBAdapter 类:

public class DBAdapter {
static final String KEY_ROWID = "_id";
static final String KEY_NAME = "name";
static final String KEY_EMAIL = "email";
static final String TAG = "DBAdapter";

static final String DATABASE_NAME = "MyDB";
static final String DATABASE_TABLE = "contacts";
static final int DATABASE_VERSION = 1;

static final String DATABASE_CREATE =
        "create table contacts (_id integer primary key autoincrement, "
        + "name text not null, email text not null);";

final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;

public DBAdapter(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        try
        {
            db.execSQL(DATABASE_CREATE);
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }
    }
}

//---opens the database---
public DBAdapter open() throws SQLException
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---
public void close()
{
    DBHelper.close();       
}   

// some other database functions here... inserts, updates etc
}

我已经创建了自己的类来处理对 DBAdapter 的所有调用:

    public static class DatabasesActivity extends Activity
{       
    static DBAdapter db;

    // Called when activity is first created
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public static long addContact(String name, String email)
    {
        if (db == null) {
            db = new DBAdapter(this); // <--- compiler error here
        }

        db.open();
        long id = db.insertContact("Joe Bloggs", "joe@bloggs.com");
        db.close();
        return id;
    }
}

addContact 方法中,在行:db = new DBAdapter(this); 中,我收到以下错误:Cannot use 'this' in静态上下文

我熟悉 OOP 概念,所以我理解为什么我会收到此错误 - 但作为 java 本身的新手,我正在寻找替代方法来实现我想要实现的目标。 DBAdapter 类构造函数接受一个 context 参数,但我不确定为什么,因为我自己没有编写该类。

澄清: 我明白为什么会发生错误。 DBAdapter 类构造函数接受一个 context 参数,当我静态使用它时,我不知道应该将什么作为上下文参数传入。我希望该类是静态的,因为我不想每次使用它时都必须对其进行实例化。

我想我真正的问题是“为什么 SQLiteOpenHelper 需要上下文?”

最佳答案

你在这里定义了一个static方法:

  public static long addContact(String name, String email)

静态方法和类变量 绑定(bind)到类而不是类的任何特定实例。您不能在其中使用 this 关键字,因为它指的是当前实例。一种选择是将方法声明为实例方法,从方法声明中删除 static 关键字,如果方法逻辑确实取决于当前实例的状态。

我认为在 static 方法中使用 this 的问题在于,如果您的代码在运行时将静态方法调用为 ClassName.staticMethodName() ,运行时将不知道如何在此上下文中解析 this

关于java - 不能在静态上下文中使用 'this',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17233367/

相关文章:

java - 在 actionlistener 中使用非局部变量

java - java多线程中的生产者消费者

java - 无法初始化 org.eclipse.wst.server.ui.internal.provisional.UIDecoratorManager 尝试启动本地服务器时出错

android - 找不到 'JAVA_HOME' 环境变量。尝试手动设置

java - 这是通过 HTTP POST 向 java Web 服务器提交 JSON 的正确方法吗?

java - 库或框架的建议?

java - 如何抑制 NumberFormatException.getMessage() 中的 "For input string: "?

java - 是否可以在不打开应用程序的情况下在 android 上运行日常任务?

java - 为什么基于 Glass/GDK 的 VoiceListener 在 XE16 中只捕获一次 VoiceCommand?

android - 绘制 2 个矩形,中间有切口