Я занимаюсь разработкой приложения для 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;
}
}
Мой вопрос: как мне заполнить базу данных массивами сведений и / или списком объектов?В примере выполняется обратный вызов каждый раз, когда вызывается операция добавления.Я просто хочу заполнить базу данных, когда пользователь регистрируется.