Выбор между контекстом действия или контекстом приложения для создания экземпляра SQLiteOpenHelper

Я новичок в разработке Android (если честно, в разработке в целом), и поэтому я читал руководство Commonsware Busy Coder. При чтении раздела SQLite есть пара вещей, которые мне не ясны на 100%. Ниже приводится то, что, по моему мнению, происходит, а также некоторые вопросы. Пожалуйста, поправьте меня, если я ошибаюсь в своем мыслительном процессе.

Автор предполагает, что если вы собираетесь использовать базу данных из более чем одного действия в своем приложении, вам не следует использовать ссылку контекста из каждого действия для создания экземпляра SQLiteOpenHelper. Вместо этого вы должны использовать getApplicationContext(), предоставленный Activity.

Делая это, он использует тот факт, что getApplicationContext() извлекает одноэлементный экземпляр Context, созданный вскоре после начала процесса приложения. Вот тут возникает мой вопрос. Я думаю, что если бы я использовал контекст, предоставленный действием (это ключевое слово) при создании экземпляра SQLiteOpenHelper, каждое действие создало бы свой собственный экземпляр SQLiteOpenHelper. Мне кажется, что простое использование контекста действия не информирует контекст приложения о том, что уже создан экземпляр SQLiteHelper, и, следовательно, он создает новый вместо повторного использования существующего. Правильно ли мое мышление?

Я думаю о Context (и поправьте меня, если я ошибаюсь) как о «шлюзе» разработчика для получения информации и ресурсов, предоставляемых ОС Android (т.е. получения системной службы через getSystemService()). Но использование this (из действия) или использование getApplicationContext() имеет разные последствия. Используя это, вы получите экземпляр Context, который является «локальным» для вашей текущей активности, но использование getApplicationContext() ссылается на все приложение. Если это правильно, означает ли это, что когда я передаю ссылку на getApplicationContext() в конструктор SQLiteOpenHelper, это сообщит всему моему приложению, что экземпляр моего SQLiteOpenHelper уже существует? созданный. Как SQLiteOpenHelper сообщает об этом приложению? использует ли он какой-либо статический метод, такой как public/private static dbCreated(Context context){//позволяет контексту знать, что запущен экземпляр этого}, чтобы сообщить приложению?

Извините, если это сбивает с толку.

Спасибо заранее


person Emmanuel    schedule 10.03.2013    source источник
comment
В чем вопрос?   -  person Neolisk    schedule 11.03.2013
comment
Извините, если это сбивает с толку. Вопросы в конце третьего и четвертого абзацев.   -  person Emmanuel    schedule 11.03.2013
comment
Это точно. Я ищу вопрос, на который можно ответить в рамках SO. Ваш пока слишком широкий.   -  person Neolisk    schedule 11.03.2013
comment
Я спрашиваю, правильный ли мой мыслительный процесс. Почему, когда я использую собственный контекст Activity для создания экземпляра вспомогательного класса базы данных, Android каждый раз создает новый экземпляр, а когда я использую getApplicationContext(), он создает только один. Извините за путаницу. Это мой первый пост...   -  person Emmanuel    schedule 11.03.2013
comment
потому что appContext является единственным экземпляром для всего приложения (например, singleton)   -  person dvrm    schedule 16.06.2015


Ответы (2)


Я думаю, что теперь я лучше понимаю концепцию контекста. Я хотел бы поделиться ссылкой, которую я нашел, которая разъясняет эту тему. http://t.co/9R0bPWiKc5

person Emmanuel    schedule 30.06.2013

Что касается вашего второго вопроса, если я правильно понимаю, Context — это своего рода реестр синглтонов. Таким образом, SQLiteOpenHelper просто создается и привязывается к данному ему контексту. Все, что использует этот контекст для получения SQLiteOpenHelper, получит этот связанный экземпляр.

person wapnik    schedule 24.02.2014
comment
Спасибо за информацию. +1. - person Emmanuel; 24.02.2014