2014-02-17 3 views
2

Я просто прочитал Using context in a fragment. Мне нужно получить контекст, чтобы инициализировать базу данных. 2 наиболее проголосовавших ответы, где Fragment#getActivity() получить Context или сделать это внутри Fragment#onAttach(Activity) метод обратного вызова.Инициализация SQLite на фрагменте

Дело в том, что для поддержания хорошо документированного кода я хочу избегать «альтернативного» способа, но делать это так, как предполагалось.

Судя по Fragment жизненного цикла найденного здесь: http://developer.android.com/guide/components/fragments.html#Creating кажется, что onAttach() вызывается перед onCreate, что означает getActivity()НЕ должен возвращать нуль в этой точке.

Вопросы будут:

  1. это означало для инициализации базы данных внутри onAttach()?
  2. Возможно ли для getActivity() вернуть null при вызове внутри onCreate(), хотя onAttach() уже был вызван?
+0

Вы решили это? У вас есть лучший ответ, который вы можете добавить, или вы можете принять другого, чтобы закрыть этот вопрос и получить его от списка без ответа, спасибо! –

+0

Да, я закончил создание моей базы данных «Singleto», поэтому каждый из моих фрагментов внутри «ViewPager» будет иметь такое же соединение. Затем я инициализировал его на моем подклассе 'Application # onCreate()' –

+0

. Вы можете отвечать на свои вопросы - вам нужно просто подобрать оставшийся без ответа список –

ответ

1

Кажется, вам было бы лучше создать ContentProvider, чтобы выполнить настройку в нужное время. Это позволяет вам легко получить доступ к БД из любого места через распознаватель контента.

+1

+1, потому что я люблю использовать CP ... добавленные значения будут также: что CP совместимы с Loaders, добавив данные через CP, вы не должны беспокоиться о обновлении ListView - это будет сделано автоматически :) – Selvin

+0

Создание ContentProvider может быть ненужной задачей. Речь шла о Context not ContentProvider. –

-1

Для инициализации базы данных достаточно ApplicationContext.

Вы можете создать свой собственный подкласс приложений, как следует (вы также должны определить его в манифесте)

class MyApp extends Application { 

    private static Application mInstance; 

    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 
    } 

    public static void context() { return mInstance.getApplicationContext(); } 
} 

Тогда из любого места, где вам нужен контекст приложения вы можете позвонить MyApp.context()

В ваш манифест:

<application android:name="MyApp"/> 
+1

Я действительно не понимаю, почему вы сделали бы что-то подобное. Вызов 'getApplicationContext()' из экземпляра 'Application' в основном аналогичен использованию' this'. – Squonk

+0

@Squonk Я могу использовать этот способ при вызове не из Activity, я могу использовать его в любом классе. Или вы имеете в виду getApplicationContext то же самое, что и Application.this. Я никогда не думал об этом, getApplicationContext() кажется более явным. –

+0

Для многих мест требуется контекст активности, поэтому контекст приложения не будет полезен. Даже игнорируя этот момент, создавая статический метод для того, чтобы делать что-то, идет вразрез с принципами OO, и, как сказал Squank, getApplicationContext() существует –

Смежные вопросы