2015-07-31 4 views
0

У меня есть MainActivity с тремя отдельными фрагментами. Мне нужно получить доступ к данным из моей базы данных SQLite в каждом из этих фрагментов.Android: Доступ к базе данных из активности или фрагмента?

Данные объекта MyObject содержит примитивные типы наряду со списком OtherObject объектов.

Так позволяет сказать, что у нас есть три фрагмента, FragmentA, FragmentB и FragmentC.

FragmentB создает MyObject объекты и сохраняет их в базе данных. При сохранении открывается FragmentC с данными MyObject.

FragmentA все MyObject объектов, и после нажатия на объект из списка открывается FragmentC, населенный выбранными MyObject.

Какая правильная реализация?

Должно ли действие управлять всем доступом к базе данных и передавать MyObject в соответствующий фрагмент?

Следует ли каждый фрагмент обращаться к базе данных каждый раз, чтобы получить доступ к данным для себя?

Должно ли FragmentA и FragmentB читать по этим данным и передать соответствующие данные MyObject на номер FragmentC?

Для случая передачи данных из fragment -> activity -> fragment или activity -> fragment, какой метод подходит лучше всего:

  1. Parcelable
  2. Intent
  3. Интерфейс (по активности)

Использование аргументации кажется трудным, так как MyObject содержит список OtherObject, и все данные не могут быть разложены и переданы в Intent очень легко.

This link показывает использование интерфейса для передачи данных от фрагмента к активности, с Фрагмент объявить интерфейс который реализуется в деятельности. Для передачи объектов из активности фрагмента, вы объявить другой интерфейс в деятельности и реализовать его в фрагменте?

Я не смог найти прямой совет.

Спасибо за любую помощь

ответ

1

Если я истолковано ситуацию правильно, я бы либо использовать interfaces передать MyObject объект от Fragment B к Activity, а затем на Fragment C или LocalBroadcastManager или EventBus. Прежде чем начать, я должен указать, что я печатаю по памяти, поэтому я не могу привести пример для LocalBroadcastManager или GreenRobot's EventBus, но оба эти варианта являются жизнеспособными альтернативами.

public class FragmentB { 
    FragCallbacks mCallbacks; 

public interface FragCallbacks { 
    void objectSavedToDatabase(MyObject object); 
} 

@Override 
public void onAttach (Activity activity) { 
    if (activity instanceof FragCallbacks) { 
     mCallbacks = (FragCallbacks) activity; 
    } 

// Logic for writing to your database, and then, on completion... 
mCallbacks.objectSavedToDatabase(objectJustWrittenToDatabase); 

Тогда в вашей деятельности

public class MainActivity implements FragmentB.FragCallbacks { 

FragmentC fragmentC; 

@Override 
public void objectSavedToDatabase(MyObject object) { 
    fragmentC = FragmentC.newInstance(params); 
    //If MyObject is Parcelable, you can pass it as a parameter here. 
    //This is probably the preferable option. Otherwise, you can use a 
    // "setMyObject()" method. 
    getFragmentManager() 
     .beginTransaction() 
     .replace(...) 
     .commit(); 
    fragmentC.setMyObject(object); 
+0

Это был скорее ответ, который я ищу, но оба ответа имеют свое место в разных сценариях. Ура! – conapart3

2

1. осуществлять ContentProvider

провайдер контента управляет доступом к центральному хранилищу данных. Поставщик является частью приложения для Android, которое часто предоставляет собственный интерфейс для работы с данными.

2. использовать ContentResolver

Этот класс предоставляет приложениям доступ к модели содержимого.

  • например. запрос прямо для курсора:
Cursor cursor = getContentResolver().query(...); 
  • или через Loader Обратный вызов

класс, который выполняет асинхронную загрузку данных. В то время как загрузчики активны, они должны контролировать источник своих данных и предоставлять новые результаты при изменении содержимого. Дополнительную информацию см. В разделе LoaderManager.

Почему?

  • U отделить модель данных от приложения логики - в небольшом проекте, не рекомендуется, но когда год проект растет и будет видеть, что усилия окупились.
Смежные вопросы