<分区>
我的目标是拥有一个包含所有函数的类,这些函数可以干净整洁地执行数据库操作——也可以用一行代码调用,例如; 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 需要上下文?”