Как правильно анализировать данные или использовать данные комнаты? - PullRequest
1 голос
/ 27 марта 2019

Я новичок в базе данных Room, но работаю над ней последние 1,5 недели. Я недавно столкнулся с проблемой.

Я не могу разобрать размер списка поездок. Когда я пытаюсь это всегда возвращать 0, даже если я использую глобальную переменную. Я полагаю, это связано с методом переопределения.

Я пытаюсь получить переменную numberOfJourneys = journeys.size. Есть ли способ обойти это. Также это во фрагменте.

private JourneyDatabase db;
private List<Journey> journeys;
private int numberOfjourneys;

 public void arrayAdapter(){
    db = Room.databaseBuilder(getContext(), JourneyDatabase.class, "MyJourneyDatabase").build();

    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            journeys = db.journeyDao().getAllJourneys();
            // journeys.size returns the correct size all the time
        }
    });

    numberOfJourneys = journeys.size();
    // journeys.size() returns 0 all the time
    for(int i=0; i<numberOfJourneys; i++){
        listOfJourneys.add(String.format("Journey %d", i));
    }
 }

Ответы [ 2 ]

1 голос
/ 27 марта 2019

AsyncTask будет выполняться в отдельном потоке. Ваш код выполнит AsyncTask и немедленно перейдет к циклу for независимо от того, завершил ли AsyncTask свое выполнение или нет. Я упомяну несколько способов, как вы можете справиться с этим.

Метод 1: Вы можете переместить цикл for внутри самой AsyncTask. Это обеспечит выполнение цикла for после выборки данных из базы данных.

Метод 2: Разрешить выполнение этого запроса в потоке пользовательского интерфейса. AFAIK, Room позволяет выполнять запросы в потоке пользовательского интерфейса, если это явно указано.

Метод 3: Использовать обратный вызов. После завершения AsyncTask вы можете использовать обратный вызов (реализованный с использованием интерфейса), который сообщит вашему действию / фрагменту, что AsyncTask завершен, и вы можете продолжить работу.

0 голосов
/ 27 марта 2019

Как следует из названия, AsyncTask выполняется асинхронно ... и именно поэтому journeys.size() возвращает туда 0 - потому что вы никогда не присваивали ему записи.

AsyncTask.execute(new Runnable() {
    @Override
    public void run() {

        /* first retrieve the data */
        journeys = db.journeyDao().getAllJourneys();
        for(int i = 0; i < journeys.size(); i++){
           listOfJourneys.add(String.format("Journey %d", i));
        }

        /* and then notify the adapter */
        arrayAdapter.notifyDataSetChanged();   
    }
});

см. документацию .

...