База данных SQLite «контекст» передана адаптеру - PullRequest
9 голосов
/ 04 мая 2011

Я следовал этому руководству , чтобы использовать базу данных SQLite в моем приложении для Android.Поскольку я новичок, у меня возникают проблемы с пониманием параметра «context», используемого в примере.

Я хочу вызвать адаптер и вставить / обновить / удалить записи из класса, который не расширяет активность, которая в этом примерерасшифровывается как контекст.

Теперь я не знаю, что передать адаптеру в качестве контекста, поскольку я не вызываю адаптер из действия.

Может кто-нибудь объяснить это?

Ответы [ 3 ]

14 голосов
/ 04 мая 2011

Передайте ActivityName.this как контекст класса в качестве аргумента конструктору класса адаптера. ActivityName - это имя Activityclass, в котором вы вызываете адаптер

8 голосов
/ 22 июля 2012

Вы можете себе представить, что контекст определяет, ГДЕ / КОГДА БД sqlite существует.Базы данных sqlite не существуют сами по себе, они существуют в пределах вашей деятельности, то есть в контексте вашей деятельности.

для следующих шагов вы должны понимать, что контекст является динамической «вещью» (в действительности вымог представить это как-то ЗДЕСЬ и СЕЙЧАС).контекст индивидуален для действия и его момента, точно так же, как вы здесь и сейчас принадлежите только вам и вашему и изменяются со временем.

если вы вызываете класс изнутри вашей деятельности, то это делает свое дело (передача контекста активности изнутри самой деятельности в порядке - вроде как вы говорите своему приятелю: это то, как я себя чувствую СЕЙЧАС).

 public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       Context contextNew = this;
       myClass(contextNew);

Простое универсальное решение (панацея) - создать статическую переменную контекста (contextVariable) внутри MyActivity и получить к ней доступ напрямую, используя: MyActivity.contextVariable.но это не работает, потому что вы получаете сообщение об ошибке при попытке объявить / использовать статическую переменную Context.

Итак, если вы планируете использовать sqlite внутри службы, которая НЕ вызывается из основной деятельности,как, например, служба, запускаемая широковещательным приемником (ни служба, ни получатель не имеют контекста как такового), тогда вы должны получить доступ к контексту исходного приложения из указанного получателя.

доступ к контексту исходного действия прост, но далеко не очевиден.

это работает для меня (спасибо @ZiGi и @Cristian):

import android.app.Service;
import android.content.Context;

public class BatchUploadGpsData extends Service {
    public Context contextNew;

    @Override
    public void onCreate() {
        contextNew = getApplicationContext();

этопример из рабочего кода, который загружает навигационные данные в базу данных в Интернете каждый раз, когда устройство Android подключается к сети WIFI.у меня есть получатель, слушающий изменения подключения (существующий в виде отдельного класса, называемого напрямую из файла манифеста).

Я надеюсь, что это имеет смысл, если вы хотите узнать больше об этом, посмотрите мой пост , где у меня есть полный (barebones) код для указанного получателя.

1 голос
/ 04 мая 2011

Как видно из примера, в ToDoAdapter передается контекст. Вы можете передать активность в качестве контекста или activity.getApplicationContext (). Читайте о контексте здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...