Как интегрировать извлеченные данные JSON с библиотекой Room Persistence - PullRequest
0 голосов
/ 27 марта 2019

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

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

Это полный класс 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);
    }
}
}

Теперь я столкнулся с проблемами, когда япопытался сохранить список объектов (и их детали) в постоянную базу данных комнаты.Я основал свой код для базы данных комнат на примере 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;
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...