Как интегрировать извлеченные данные JSON с библиотекой сохраняемости в помещении

#java #php #android #json #android-asynctask

#java #php #Android #json #android-asynctask

Вопрос:

Я разрабатываю приложение для Android (Android Studio — Java), которое включает в себя процесс входа и регистрации. Я позаботился о процессах входа и регистрации, внедрив соединение между файлами PHP и базой данных MySQL через http. Короче говоря, я только что создал класс AsyncTask в java — вызываемый из другого класса — и использовал его для отправки данных в файл PHP, оттуда я просто использовал соответствующие команды SQL. Эта часть работает нормально.

Эта первая часть с входом в систему и регистрацией важна, потому что каждый пользователь увидит немного другой макет после входа в систему. Макет представляет собой RecyclerView, состоящий из подробных элементов CardView. Каждый CardView содержит несколько текстовых представлений с некоторыми подробностями. Подробности хранятся в объекте, который я создал в отдельном классе. Для заполнения элементов CardView a извлек некоторые данные JSON, используя отдельный PHP-файл (и еще одно http-соединение). Разбиение данных из JSON на строки и целые числа было простым делом, как и добавление их в список пользовательских объектов. Ниже приведен некоторый код, показывающий, как я извлек данные и добавил их в список объектов.

Это полный класс AsyncTask:

 public class ScheduleWorker extends AsyncTask<String, Void, String> {
Context context;
AlertDialog alertDialog;
ScheduleWorker (Context ctx) { context = ctx; }

@Override
protected  void onPreExecute() { super.onPreExecute(); }

@Override
protected void onPostExecute (String s) {
    super.onPostExecute(s);
    Toast.makeText(context, s, Toast.LENGTH_SHORT).show();
    try {
        loadJSON(s);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
@Override
protected String doInBackground(String... params) {
    final String fetch_url = "http://192.168.1.70/newfetcher.php";

    try {
        String ussr_name = params[0];
        URL url = new URL(fetch_url);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
        con.setDoOutput(true);
        con.setDoInput(true);
        OutputStream outputStream = con.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        String post_data = URLEncoder.encode("user_name", "UTF-8") "=" URLEncoder.encode(ussr_name, "UTF-8");
        bufferedWriter.write(post_data);
        bufferedWriter.flush();
        bufferedWriter.close();
        outputStream.close();
        StringBuilder sb = new StringBuilder();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String json;

        while ((json = bufferedReader.readLine()) != null) {
            sb.append(json   "n");
        }

        return sb.toString().trim();
    } catch (Exception e) {
        return null;
    }
}

private void loadJSON(String json) throws JSONException {
    JSONArray jsonArray = new JSONArray(json);
    Course course;
    List<Course> courses = new ArrayList<Course>();
    int len = jsonArray.length();

    String[] titles = new String[len];
    String[] types = new String[len];
    String[] teachers = new String[len];
    int[] pics = new int[len];

    for (int i = 0; i < len; i  ) {
        JSONObject obj = jsonArray.getJSONObject(i);

        titles[i] = obj.getString("title");
        types[i] = obj.getString("type");
        teachers[i] = obj.getString("teacher");
        pics[i] = obj.getInt("pic");
        course = new Course(titles[i], types[i], teachers[i], pics[i]);
        courses.add(course);
    }
}
}
  

Теперь, когда я столкнулся с проблемами, это когда я попытался сохранить список объектов (и их детали) в постоянной базе данных Room. Я основал свой код для базы данных Room на примере из Google Developer CodeLabs. Я адаптировал код для своих конкретных нужд, но сохранил базовую структуру классов. Структура включает в себя: сущность, DAO, базу данных RoomDatabase, репозиторий, ViewModel, ViewHolder, адаптер для RecyclerView и класс для заполнения базы данных. Все кажется прекрасным, за исключением той части, где я заполняю базу данных. В примере заполняется база данных с помощью обратного вызова и AsyncTask в классе RoomDatabase.

Здесь выполняется заполнение AsyncTask:

 private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback() {

    @Override
    public void onOpen(@NonNull SupportSQLiteDatabase db) {
        super.onOpen(db);
        // If you want to keep the data through app restarts,
        // comment out the following line.
        new PopulateDbAsync(INSTANCE).execute();
    }
};

/**
 * Populate the database in the background.
 * If you want to start with more words, just add them.
 */
private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {

    private final WordDao mDao;

    PopulateDbAsync(WordRoomDatabase db) {
        mDao = db.wordDao();
    }

    @Override
    protected Void doInBackground(final Void... params) {
        // Start the app with a clean database every time.
        // Not needed if you only populate on creation.

        Word word = new Word("Hello");
        mDao.insert(word);
        word = new Word("World");
        mDao.insert(word);
        return null;
    }
}
  

Мой вопрос в том, как мне заполнить базу данных массивами сведений и / или списком объектов? В примере выполняется обратный вызов каждый раз, когда вызывается действие добавления. Я просто хочу заполнить базу данных при регистрации пользователя.

Комментарии:

1. Вы пытаетесь сохранить курсы List<Course> courses ?

2. Да, я хочу сохранять курсы в базе данных с сохраняемостью room, чтобы пользователю не приходилось загружать все свои данные при каждом входе в систему. Асинхронная задача для извлечения данных вызывается в методе onPostExecute асинхронной задачи регистрации, поэтому я просто хочу сохранить данные один раз при регистрации пользователя