2015-09-19 3 views
5

Я изучаю RxJava и прохожу через несколько статей и видео. Я полностью чувствовал себя прекрасно, что может предложить RxJava, поэтому я думаю, что в настоящее время я понял, что такое реактивное программирование. This tutorial by Dan Lew несколько помог мне понять основы использования RxJava. Но я узнал, что чем больше я думал, что полностью понял RxJava, тем больше вопросов вышло из моего ума.Начало работы с RxJava с sqlite

Поскольку я парень, который больше всего учится писать код, вот что я пытаюсь сделать. У меня уже есть приложение, в котором используется SQLite. Мое приложение имеет 7 круговых диаграмм, которые получают свои данные из курсора базы данных. Каждая круговая диаграмма получает от курсора другую строку данных (значения поплавка) и генерирует диаграмму в соответствии с ее данными.

То, что я пытаюсь сделать сейчас, я хочу использовать RxJava для извлечения данных из базы данных и заполнения диаграммы. Но я теряю информацию о том, как RxJava должен взаимодействовать с базой данных. Нужно ли использовать любую дополнительную библиотеку для этого? Потому что я нашел rxjava-jdbc и SqlBrite, которые, я думаю, должны помочь мне в этом, но действительно ли они мне нужны? Я также нашел question in SO, который, похоже, не использует какую-либо дополнительную библиотеку (за исключением RxJava, конечно), и он, кажется, использует ContentObservable, но я до сих пор не полностью ее понимаю. Кроме того, парень, который ответил на его вопрос, даже не использует ContentObservable. И я просто знал, что Android имеет свой собственный класс Observable. Совместим ли он с RxJava? Если нет, почему одно и то же имя ?.

Кто-то пожалуйста, помогите мне ...

=================================== =====================

в ответ на решение GreyBeardedGeek в поле ниже:

Это мой Callable, который извлекает данные из SQLite

public class GetIncome implements Callable<Map<String,String>> { 
    public static final String FILE_NAME = "CGetIncome"; 

    Context myContext; 
    int year, month; 

    public GetIncome(Context context, int getYear, int getMonth){ 
     myContext = context; 
     year = getYear; 
     month = getMonth; 
    } 

    @Override 
    public Map<String,String> call() throws Exception { 
     Map<String,String> output = new HashMap<>(); 
     JarControl jc = new JarControl(myContext); 
     JSONObject getIncome = jc.getIncome(year,month,0,0); 

     output.put("necessities",getIncome.getString("necessities")); 
     output.put("savings",getIncome.getString("savings")); 

     return output; 
    } 
} 

И вот как я пытаюсь использовать Callable из своей основной деятельности:

Callable<Map<String,String>> getIncome = new GetIncome(getContext(),2015,9); 

Теперь я не знаю, как установить getIncome в Observables. Вы упомянули из Callables в rx, должны это сделать .. но на самом деле, как это сделать? Согласно this tutorial that shows how to use Observable.from, поэтому я ожидаю, что смогу использовать Callables, выполнив Observable.fromCallable, но, по-видимому, функция не существует. Быстрый googled показал, что .fromCallable следует использовать, делая что-то вроде Async.fromCallable(), но поскольку я очень новичок в RxJava, я могу только понять, как создать вызываемый в соответствии с тем, как the tutorial показывает ...

И извините за мой крайней noobness на RxJava

ответ

5

Я уверен, что там будет куча других мнений, но до сих пор, я взял несколько различных подходов:

  • Если вы хотите относительно небольшой объем данных (и вы можете гарантировать, что он всегда будет иметь известную верхнюю границу по размеру), а затем:

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

EDIT: Пример кода:

private Map<String, String> getDataFromDatabase() { 
    Map<String, String> result = new HashMap<>(); 
    // do whatever you need to (i.e. db query, cursor) to fill it in 
    return result; 
} 

private Callable<Map<String, String>> getData() { 
    return new Callable() { 
     public Map<String, String> call() { 
     return getDataFromDatabase(); 
    } 
} 

// in utility class RxUtil.java 
public static <T> Observable<T> makeObservable(final Callable<T> func) { 
     return Observable.create(
       new Observable.OnSubscribe<T>() { 
        @Override 
        public void call(Subscriber<? super T> subscriber) { 
         try { 
          T observed = func.call(); 
          if (observed != null) { // to make defaultIfEmpty work 
           subscriber.onNext(observed); 
          } 
          subscriber.onCompleted(); 
         } catch (Exception ex) { 
          subscriber.onError(ex); 
         } 
        } 
       }); 
    } 


// and finally, 
public Observable<Map<String, String>> getDataObservable() { 
    return RxUtil.makeObservable(getData()); 
} 
+0

Концептуально, я думаю, я понимаю ваше решение. Но практически, у меня проблемы с ее реализацией. «создать синхронный метод, который обращается к базе данных, получает курсор, выполняет итерацию курсора для создания структуры данных (например, списка), содержащей данные, и затем возвращает ее». легко, но моя структура данных - это Map , потому что позже мне нужно определить, для какой переменной является возвращаемое значение. Но «Создать вызываемый, который вызывает метод» и «Использовать rx.fromCallable для создания наблюдаемого» ... как я на самом деле это делаю? Я обновил свой вопрос выше тем, что я сделал. – imin

+0

Я добавил несколько примеров кода в свой ответ. Это фактический код из моего производственного приложения. – GreyBeardedGeek

+0

Спасибо за ваш код GreyBeardedGeek, но извините, я до сих пор не вижу связи между Observable makeObservable и Callable getData .. как данные getData попадают в makeObservable? – imin