List DataModel читает только последний элемент - PullRequest
1 голос
/ 29 апреля 2019

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

Код 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();
}

1 Ответ

1 голос
/ 30 апреля 2019

Если я правильно понимаю: метод 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...