Listview получает popuplated из базы данных каждый раз, когда я начинаю действие

Я получаю некоторые данные json в EventApp, и я пытаюсь сохранить в базе данных SQLite некоторые события. Я показываю события в другом действии, не главном, и всякий раз, когда я возвращаюсь от этого действия к главному и я возвращаюсь к действию с listview, данные дублируются каждый раз. Таким образом, если я нажимаю, чтобы перейти к этому действию 10 раз, мои данные получают 10 раз в listview и в базе данных, а также. Как это исправить?

SQLiteDatabase db = getWritableDatabase();

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

//Add new row to the database
public void addEvent(Event ev){
    ContentValues contentValues = new ContentValues();
    contentValues.put(DatabaseHelper.TITLE, ev.getTitle());
    contentValues.put(DatabaseHelper.START_DATE, ev.getStartTime());
    contentValues.put(DatabaseHelper.END_DATE, ev.getEndTime());
    contentValues.put(DatabaseHelper.IMAGE_URL, ev.getImageURL());
    contentValues.put(DatabaseHelper.URL, ev.getUrl());
    contentValues.put(DatabaseHelper.SUBTITLE, ev.getSubtitle());
    contentValues.put(DatabaseHelper.DESCRIPTION, ev.getDescription());
    db.insert(TABLE_NAME, null, contentValues);
    //db.close();
}

//Delete event from database
public void deleteEvent(String eventTitle){
    db.execSQL("DELETE FROM " + TABLE_NAME + "WHERE " + TITLE + "="" + eventTitle + "";" );
}

public int deleteEvents() {
    return db.delete(DatabaseHelper.TABLE_NAME, null, null);
}

//Print the database as string
public String databaseToString(){
    String dbString="";

    //points to a location in results
    Cursor c = getEvents();

    while (c.moveToNext()){
        if(c.getString(c.getColumnIndex("Title")) != null){
            dbString += c.getString(c.getColumnIndex("Title"));
            dbString += "n";
        }
    }
    //db.close();
    return dbString;
}

public Cursor getEvents(){
    return db.query(TABLE_NAME, ALL_COLUMNS, null, null, null, null, null, null);
}

}

Это действие, в котором я показываю данные из базы данных

public class StoredEventsActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.stored_events);

    ListView listView = (ListView) findViewById(R.id.lv_stored_events);

    Intent intent = getIntent();
    ArrayList<Event> events = new ArrayList<Event>();

    events = (ArrayList<Event>) intent.getSerializableExtra("storedEvents");

    EventAdapter adapter = new EventAdapter(this, R.layout.list_view_row, R.id.stored, events );
    listView.setAdapter(adapter);
}

}

Вот метод, который возвращает сохраненные события

public static ArrayList<Event> returnStoredEvents(){
    long id = -1;
    //getStoredEvents();
    Cursor c = eventsDB.getEvents();

    while (c.moveToNext()){
        id = c.getInt(c.getColumnIndex(eventsDB.ID));
        String title = c.getString(c.getColumnIndex(eventsDB.TITLE));
        String start = c.getString(c.getColumnIndex(eventsDB.START_DATE));
        String end = c.getString(c.getColumnIndex(eventsDB.END_DATE));
        organizeEvents.add(new Event(title, start, end, true));
    }
    c.close();
    Log.d("DATABASE", organizeEvents.toString());
    return organizeEvents;
}

Вот где я на самом деле добавить некоторые из событий:

private void readEvents(String str){
    Event ev = null;
    try {
        JSONObject geoJSON = new JSONObject(str);
        JSONArray jsonEvents = geoJSON.getJSONArray("events");
        for (int i = 0; i < jsonEvents.length(); i++) {
            JSONObject event = jsonEvents.getJSONObject(i);
            JSONArray timeJsonEvent = event.getJSONArray("datelist");
            JSONObject time = timeJsonEvent.getJSONObject(0);

            title = event.getString("title_english");

            Date date = new Date(time.getLong("start"));
            startDate = dateFormat.format(date);

            date = new Date(time.getLong("end"));
            endDate = dateFormat.format(date);

            imageURL = event.getString("picture_name");
            url = event.getString("url");
            subtitle = event.getString("subtitle_english");
            description = event.getString("description_english");

            if (title.charAt(0) == 'T') {
                ev = new Event(title, startDate, endDate, true);
                eventsDB.addEvent(ev);
            }else {
                    ev = new Event(title, startDate, endDate, false);
            }

            // Process a newly found event
            final Event finalEv = ev;
            handler.post(new Runnable() {
                public void run() {
                    addNewEvent(finalEv);
                }
            });
        }
    }catch (Exception e) {
        Log.d(null, e.getMessage());
    }
}

А вот моя главная:

public class MainActivity extends AppCompatActivity{
DatabaseHelper eventsDB;
ListFragment listFragment;
SimpleCursorAdapter adapter;
Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    eventsDB = new DatabaseHelper(this);
    //storedEvents.addAll(EventsListFragment.returnStoredEvents());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getTitle().equals("Sort by name")){
        Toast.makeText(this, "ITEM 2 CLICKED", Toast.LENGTH_LONG).show();
        EventsListFragment.sort(-1);
    }else if (item.getTitle().equals("Sort by date")) {
        EventsListFragment.sort(1);
    }else if (item.getTitle().equals("Stored events")){
        showSavedEvents();
        Toast.makeText(this, "ITEM 3 CLICKED", Toast.LENGTH_LONG).show();
    }
    return true;
}

public void showSavedEvents(){
    intent = new Intent(this, StoredEventsActivity.class);
    intent.putExtra("storedEvents", EventsListFragment.returnStoredEvents());
    startActivity(intent);
}

}

1 ответ

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

    попробуйте это в хранении данных только один раз

    https://stackoverflow.com/a/37449709/6312749