如何正确使用外键实现模型插入?

时间:2019-03-24 14:22:59

标签: java android json rest architecture

我正在按照干净的体系结构制作一个基本的应用程序来学习它,并且我不确定在需要插入顺序时如何实现模型插入。

我拥有“活动”,“艺术家”,“广告”实体。 -活动中有一位或多位歌手。 -艺术家有一个或多个活动。 -广告中有一个活动和/或演出者。

我从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方法。干净的拱门实现这一目标的好方法是什么? 也许我需要使用一个可以调用多个仓库的交互器来升级我的模型? 谢谢

0 个答案:

没有答案