Моя цель - иметь класс, содержащий все функции, которые выполняют операции с базой данных чисто и аккуратно, - которые также могут быть вызваны с помощью одной строки кода, например; 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", "[email protected]");
db.close();
return id;
}
}
В addContact
метод, на строке: db = new DBAdapter(this);
, появляется следующая ошибка: Cannot use 'this' in a static context
.
Я знаком с концепциями ООП, поэтому я понимаю почему Я получаю эту ошибку - но будучи новым для самой java, я ищу альтернативные методы для достижения того, чего я пытаюсь достичь. Конструктор класса DBAdapter принимает параметр context
, но я не уверен, почему, поскольку я сам этого не написал.
Чтобы уточнить: Я понимаю, почему возникает ошибка. Конструктор класса DBAdapter принимает параметр context
, и я не знаю, что передать в качестве параметра контекста при его статическом использовании. Я хочу, чтобы класс был статичным, поскольку я не хочу, чтобы он создавал его каждый раз, когда я хочу его использовать.
Я предполагаю, что мой реальный вопрос будет «почему SQLiteOpenHelper требует контекста?»
Если им не так, как в C++, java не подразумевает его отправку. – Infested
@MarcoForberg Я редко использовал 'this' в C#. Ваш комментарий не очень полезен. –
@Teifi, и именно поэтому это комментарий и никакого ответа. Просто интересно, потому что я использую его довольно часто. по крайней мере один раз в каждом классе –