List DataModel читает только последний элемент

У меня есть база данных, созданная с обновлениями местоположения, и в базе данных есть куча местоположений x и y. а во втором методе readFirestore() считывает данные о местоположении и сравнивает избранные местоположения, полученные из базы данных sqlite, и если любимое местоположение находится рядом с данными из firestore, оно записывает название кампании, которое находится в том же месте, в другую базу данных. Но когда я хочу сравнить любимое место в методе firestore, есть только последний элемент базы данных. Я смотрел с Журналом.

Код 1:

public List<DataModel> listFavoriteLocation(){
    db = new DatabaseHelper(this);
    SQLiteDatabase mydb = db.getWritableDatabase();
    List<DataModel> data=new ArrayList<>();
    Cursor csr = mydb.rawQuery("select * from "+TABLE+" ;",null);
    StringBuffer stringBuffer = new StringBuffer();
    DataModel dataModel = null;
    while (csr.moveToNext()) {
        dataModel= new DataModel();
        String FAVCurrentLocationLAT = csr.getString(csr.getColumnIndexOrThrow("FAVCurrentLocationLAT"));
        String FAVCurrentLocationLONG = csr.getString(csr.getColumnIndexOrThrow("FAVCurrentLocationLONG"));
        dataModel.setFAVCurrentLocationLAT(FAVCurrentLocationLAT);
        dataModel.setFAVCurrentLocationLONG(FAVCurrentLocationLONG);
        stringBuffer.append(dataModel);
        data.add(dataModel);

    }
    for (DataModel mo:data ) {
        this.List_FAVCurrentLocationLAT = mo.getFAVCurrentLocationLAT();
        this.List_FAVCurrentLocationLONG = mo.getFAVCurrentLocationLONG();
         Log.i("helloLAT",""+List_FAVCurrentLocationLAT); //OK
         Log.i("helloLONG",""+List_FAVCurrentLocationLONG); //OK
    // This section writes the favorite locations seperately to the log. 
     }
    return data;
}

Код 2:

public void readFirestore() {
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("campaigns")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                private String FSname,FScityLAT,FScityLONG,FScampaignStartDate,FScampaignEndDate;

                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful() && task.getResult() != null) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            String name = document.getString("name");
                            String cityLAT = document.getString("cityLAT");
                            String cityLONG = document.getString("cityLONG");
                            String campaignStartDate = document.getString("campaignStartDate");
                            String campaignEndDate = document.getString("campaignEndDate");

                            this.FSname = name;
                            this.FScityLAT = cityLAT;
                            this.FScityLONG = cityLONG;
                            this.FScampaignStartDate = campaignStartDate;
                            this.FScampaignEndDate = campaignEndDate;

                            listFavoriteLocation();

                            String FS_FAVCurrentLocationLAT = List_FAVCurrentLocationLAT;
                            String FS_FAVCurrentLocationLONG = List_FAVCurrentLocationLONG;

                            Log.i("hellolist",""+List_FAVCurrentLocationLAT); // just writes the last loc item from sqlite

                            double FS_FAVCurrentLocationLAT_double = Double.parseDouble(FS_FAVCurrentLocationLAT); // Fav Loc DB
                            double FS_FAVCurrentLocationLONG_double = Double.parseDouble(FS_FAVCurrentLocationLONG);                                 double FScityLAT_double = Double.parseDouble(FScityLAT);  // Campaign Loc Firestore LAT
                            double FScityLONG_double = Double.parseDouble(FScityLONG);  

                            double theta = FScityLONG_double - FS_FAVCurrentLocationLONG_double;
                            double dist = Math.sin(Math.toRadians(FS_FAVCurrentLocationLAT_double)) * Math.sin(Math.toRadians(FScityLAT_double)) + Math.cos(Math.toRadians(FS_FAVCurrentLocationLAT_double)) * Math.cos(Math.toRadians(FScityLAT_double)) * Math.cos(Math.toRadians(theta));
                            dist = Math.acos(dist);
                            dist = Math.toDegrees(dist);
                            dist = dist * 60 * 1.1515;
                            dist = dist * 1.609344;

                            if (dist <= 0.5) // 500 meter
                            {
                                SQLiteQueryFavCampaign = "INSERT OR REPLACE INTO myTable3(FAVCampaignName, FAVCampaigncampaignStartDate, FAVCampaigncampaignEndDate)" + " VALUES('"+FSname+"','"+FScampaignStartDate+"','"+FScampaignEndDate+"');";
                                SQLITEDATABASEFavCampaign.execSQL(SQLiteQueryFavCampaign);
                                Log.i("helloname",""+FSname);
                            }
                        }
                    } else {
                    }
                }
            });

    Toast.makeText(CampaignActivity.this,"Creating", Toast.LENGTH_SHORT).show();
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю: метод listFavoriteLocation правильно извлекает данные, которые вы ожидаете из базы данных. Если вы посмотрите на остальную часть своего кода, вы увидите, что вы перебираете список данных и перезаписываете свои переменные экземпляра с ними, одну за другой, пока список не будет полностью перебран, то есть вы сохранит последний элемент в вашем экземпляре только после того, как вы покинете метод.

Итак, чтобы было ясно, следующий блок будет правильно регистрировать каждый элемент, но только значения последнего элемента будут сохранены в двух переменных экземпляра, которые вы используете (FAVCurrentLocationLAT и FavCurrentLocationLong):

for (DataModel mo:data ) {
    this.List_FAVCurrentLocationLAT = mo.getFAVCurrentLocationLAT();
    this.List_FAVCurrentLocationLONG = mo.getFAVCurrentLocationLONG();
    Log.i("helloLAT",""+List_FAVCurrentLocationLAT); //OK
    Log.i("helloLONG",""+List_FAVCurrentLocationLONG); //OK
    // This section writes the favorite locations seperately to the log. 
}

Что вам нужно сделать, так это использовать возвращенный список data, загружаемый в метод listFavoriteLocation, а затем манипулировать им в следующем коде по своему усмотрению.

Так, например:

List<DataModel> data = listFavoriteLocation();
for (int i = 0; i < data.size(); i++) {
    DataModel dataModel = data.get(i);
    log.i("Data model "+i+": "+dataModel);
    // Do work on each data model element here
}

Сэр, спасибо за ваш ответ, но я могу прочитать данные отдельно в первом методе модели данных списка. Но я не могу получить доступ ко всем данным в readFirestore() в этом методе, только последний элемент, заданный для переменных из метода списка.

user11416323 30.04.2019 12:30

@LBT Действительно. Это связано с тем, что первый метод не предоставляет данные, с которыми он работает. Итак, чтобы использовать его в вашем методе readFirestore, вам нужно использовать список, который он возвращает, назначив ему другую ссылку. Итак, используйте List<DataModel> data = listFavoriteLocation(); в своем методе readFirestore, и тогда у вас будут все его данные в этом новом списке.

M. Brynczka 30.04.2019 17:33

Другие вопросы по теме