我正在按照干净的体系结构制作一个基本的应用程序来学习它,并且我不确定在需要插入顺序时如何实现模型插入。
我拥有“活动”,“艺术家”,“广告”实体。 -活动中有一位或多位歌手。 -艺术家有一个或多个活动。 -广告中有一个活动和/或演出者。
我从Json文件在线获取数据,然后我的适配器为我的数据层模型映射数据。 现在我有了需要插入的数据,但是例如,当我插入引用某个艺术家的广告时,我需要首先插入该艺术家,以便广告的外键可以引用该艺术家,而我的问题是: 如果我想同时插入或插入所有数据,如何遵守插入顺序以避免外键错误?
我的应用程序将广告列表显示为第一视图。我设法通过在我的artistRepository中(在域层中)插入一个Task来在onPostExecute中调用advertRepository的Insert方法来做到这一点,但这肯定是错误的方式,因为我从另一个仓库中调用了一个仓库的方法。
public class upsertFromServerAsync extends AsyncTask<Void, Void, JsonResponse> {
//My mapper
JsonResponse myResponse;
@Override
protected JsonResponse doInBackground(Void... voids) {
retrofit = RetrofitClient.getInstance();
apiService = retrofit.create(ApiService.class);
Call<JsonResponse> call = apiService.getJsonFromServer("yh4ra");
try {
//Getting my data
myResponse = call.execute().body();
//Inserting events
List<Event> events = myResponse.getEvents();
for (Event event : events) {
upsertEvent(event);
}
//Inserting artists
List<Artist> artists = myResponse.getArtists();
for (Artist artist : artists) {
upsertArtist(artist);
}
} catch (IOException e) {
e.printStackTrace();
}
return myResponse;
}
@Override
protected void onPostExecute(JsonResponse myResponse) {
super.onPostExecute(myResponse);
AsyncTask.execute(() -> {
List<Advert> advertsFromJson = jsonAdapter.getAdvertsFromJson(myResponse);
for (Advert advert : advertsFromJson) {
Log.d("test", advert.getArtistName() + "");
upsertAdvert(advert);
}
});
}
}
这个解决方案是一团糟,我最终在我的EventRepo中有了upsertArtist和upsertAdvert方法。干净的拱门实现这一目标的好方法是什么? 也许我需要使用一个可以调用多个仓库的交互器来升级我的模型? 谢谢