package com.nilhcem.bblfr.model.locations.dao; import android.database.sqlite.SQLiteDatabase; import com.nilhcem.bblfr.model.locations.Audience; import com.nilhcem.bblfr.model.locations.Interest; import com.nilhcem.bblfr.model.locations.Location; import com.nilhcem.bblfr.model.locations.LocationInterest; import com.nilhcem.bblfr.model.locations.LocationsData; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import ollie.Ollie; public class JsonToDatabaseDao extends com.nilhcem.bblfr.model.JsonToDatabaseDao<LocationsData> { @Inject public JsonToDatabaseDao() { } @Override public void saveJsonToDatabase(LocationsData data) { SQLiteDatabase database = Ollie.getDatabase(); database.beginTransaction(); try { deleteExistingData(database); Map<String, Interest> interestsMap = saveInterests(data.locations); saveLocations(data.locations, interestsMap); database.setTransactionSuccessful(); } finally { database.endTransaction(); } } @Override public void deleteExistingData(SQLiteDatabase database) { database.delete("audiences", null, null); database.delete("locations_interests", null, null); database.delete("locations", null, null); database.delete("interests", null, null); } private Map<String, Interest> saveInterests(List<Location> locations) { Map<String, Interest> map = new HashMap<>(); for (Location location : locations) { List<Interest> interests = location.interests; if (interests != null) { for (Interest interest : interests) { if (map.get(interest.name) == null) { interest.save(); map.put(interest.name, interest); } } } } return map; } private void saveLocations(List<Location> locations, Map<String, Interest> interestsMap) { for (Location location : locations) { location.save(); saveLocationInterests(location, location.interests, interestsMap); saveLocationAudience(location, location.audience); } } private void saveLocationInterests(Location location, List<Interest> interests, Map<String, Interest> interestsMap) { if (interests != null) { for (Interest locationInterest : interests) { Interest interest = interestsMap.get(locationInterest.name); if (interest != null) { LocationInterest li = new LocationInterest(location, interest); li.save(); } } } } private void saveLocationAudience(Location location, Audience audience) { if (audience != null) { audience.location = location; audience.save(); } } }