Карты устраняют проблему с хранением в arraylist

#android #database #sqlite #maps

#Android #База данных #sqlite #Карты

Вопрос:

Я работаю над проектом Google Maps.Пользователи могут добавлять местоположения и просматривать их в gridview.Когда я запускаю свое приложение для просмотра всех местоположений из базы данных, все индексы успешно извлекаются из базы данных и передаются в arraylist.Но когда я пытаюсь добавить местоположение.Все предыдущие местоположения снова добавляются в базу данных, затем мое желаемое местоположение добавляется в конец массива.Поэтому, когда я пытаюсь добраться до нужного местоположения из gridview, оно показывает мне первое местоположение.Я хочу, чтобы это повторилось только один раз.Я думаю, что в моем запросе select есть проблема.Вот результат вывода. Результат

     GridView gridView= (GridView) findViewById(R.id.gridView);
    list = new ArrayList<>();
    try {

        MapsActivity.database = this.openOrCreateDatabase("Places",MODE_PRIVATE,null);
        Cursor cursor = MapsActivity.database.rawQuery("SELECT * FROM places",null);
        int nameIx = cursor.getColumnIndex("name");
        int latitudeIx = cursor.getColumnIndex("latitude");
        int longitudeIx = cursor.getColumnIndex("longitude");
        while (cursor.moveToNext()) {
                nameFromDatabase = cursor.getString(nameIx);
                String latitudeFromDatabase = cursor.getString(latitudeIx);
                String longitudeFromDatabase = cursor.getString(longitudeIx);
                image = cursor.getBlob(3);
                // names.add(nameFromDatabase);
                Double l1 = Double.parseDouble(latitudeFromDatabase);
                Double l2 = Double.parseDouble(longitudeFromDatabase);
                //   System.out.println("coordinates:" l1 "," l2);
                locationFromDatabase = new LatLng(l1, l2);
                names.add(nameFromDatabase);
                locations.add(locationFromDatabase);
                list.add(new Location(nameFromDatabase, image));

            }

        cursor.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    adapter = new LocationListAdapter(this, R.layout.location_items, list);
    gridView.setAdapter(adapter);
  

Ответ №1:

Я подозреваю, что ваша проблема заключается в том, что при добавлении нового местоположения вы снова получаете все местоположения с карт Google.

  • Ваш код не включает код для добавления местоположения.

Однако вы могли бы предотвратить дублирование данных, определив соответствующие УНИКАЛЬНЫЕ ограничения для вашей базы данных Places.

В качестве примера, на основе вашего кода, вы могли бы СОЗДАТЬ таблицу с помощью :-

         CREATE TABLE IF NOT EXISTS places (name TEXT UNIQUE ON CONFLICT IGNORE,longitude REAL,latitude REAL,image BLOB, UNIQUE (longitude,latitude) ON CONFLICT IGNORE)
  

Использование name TEXT UNIQUE ON CONFLICT IGNORE добавит ограничение / правило / constraint, согласно которому имя должно быть уникальным, и если будет предпринята попытка использовать имя, которое уже существует (вставить или обновить), то эта попытка будет проигнорирована (ошибка не возникает).

Использование UNIQUE (longitude,latitude) ON CONFLICT IGNORE делает то же самое, НО для комбинации ОБОИХ столбцов.

например, если строка в таблице имеет широту 1 и долготу 1, то :-

  • попытка добавить строку с широтой 1 и долготой 1 приведет к игнорированию попытки.

  • попытка добавить строку с широтой 2 и долготой 1 сработает, поскольку комбинация двух значений не использовалась.

  • аналогично, попытка добавить строку с широтой 1 и долготой 2 будет работать.