Фон: У меня есть приложение для опроса, в котором я нажимаю кнопки в recyclerView
, которое обновляет базу данных, используя запрос на обновление, определенный в Dao.java
.Затем у меня есть класс результатов, где я получаю базу данных как List
, используя запрос, определенный в том же месте.Я перебираю его, используя простой цикл for (что плохо, но я тоже), затем отправляю строку в editTextView
.
Проблема : каждое обновление будет обновлятьсяполя последующих столбцов.Таким образом, все работает, как и ожидалось, если я заполняю вопросы 1 -> 15. Но если Person A
отвечает только на вопрос 1, то запускает действие результатов и нажимает кнопку, которая показывает ответ каждого пользователя на вопрос 2 (например), затемответ на вопрос 1 раскрывается в строке лица А.Это будет замаскировано (в большинстве случаев), если Person A
продолжается и отвечает на каждый вопрос по очереди.Тем не менее, будут некоторые глюки, например, вопрос 4 перезапишет вопрос 5 в базе данных (но не наоборот).Поэтому, если Person A
передумает по вопросу 4, у нас будут повторные ответы в 4 и 5.
Мои мысли: Мне интересно, является ли это ошибкой SQL-запроса на моемчастично или, может быть, именно поэтому вы должны использовать репозиторий (которого у меня нет).Я в основном ужасен в этом и буду благодарен за любой совет.Как и все, чего я хочу, это стать лучше в следующий раз.
Dao.java
@Entity(tableName = "surveyTable")
public class Model {
@PrimaryKey
public int person;
private int questionNumber1;
public int answer;
// allows Room to set every field of the table.
// these setter methods...
public Model(int person, int questionNumber1, int questionNumber2, int questionNumber3, int questionNumber4,
int questionNumber5, int questionNumber6, int questionNumber7, int questionNumber8,
int questionNumber9, int questionNumber10, int questionNumber11, int questionNumber12,
int questionNumber13, int questionNumber14, int questionNumber15)
{
this.person = person;
this.questionNumber1 = questionNumber1;
this.answer = answer;
}
// and these getter methods ...
public int getPerson(){
return person ;
}
public int getQuestionNumber1(){
return questionNumber1;
}
public int getAnswer(){
return answer;
}
// make it possible for Room to make objects for us but protects them
// from editing afterwards
}
Results.java
.Для каждой кнопки, string / int [] и string есть еще 14, которые я удалил для удобства чтения.Например, личное int questionNumber1;
Private int questionNumber2;
Private int questionNumber3;
... Private int questionNumber15;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_results);
resultsTextView = findViewById(R.id.resultsTextView);
Q1 = (Button) findViewById(R.id.resultsButton1);
Q1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
resultsTextView.setText(answerString(1));
}
});
public String answerString(int i){
int questionNumber = i - 1;
String[] strings = answerArray();
String questionNumberString = strings[questionNumber];
return questionNumberString;
}
public String[] answerArray(){
List<Model> allItems2 = getDatabase(mContext).surveyDao().getAllItems();
int q1;
String str1 = "";
String[] strings = new String[15];
int[] a1 = new int[allItems2.size()];
for (int i = 0; i < allItems2.size(); i++) {
Model element = allItems2.get(i);
q1 = element.getQuestionNumber1();
a1[i] = q1;
}
for(int i=0;i<a2.length;i++) {
str1 = str1 + Integer.toString(a1[i])+ " ";
}
strings[0] = str1;
return strings;
}
ViewModel.java
.Это Async task
обновляет базу данных по нажатию кнопки в основной активности.Я волновался, передавая дополнительную переменную int q методу, который не был найден в реальном запросе, но мне нужно было каким-то образом указать, на какой вопрос мы отвечаем.
public void updateResult(int id, int answer, int q) {
MyTaskParams params = new MyTaskParams(id, answer, q);
addAsyncTask myTask = new addAsyncTask(appDatabase);
new addAsyncTask(appDatabase).execute(params);
}
// Wrapping our primitives into a single, simple container so we can pass it to
// AsyncTask. Because the 1st param of AsyncTask<1st, 2nd, 3rd> goes into
// do inBackground [our workhouse background thread] which is what we want.
// But a comma for an extra variable [which is what we need] would feed that var
// into onProgressUpdate (Param 2). Not what we want.
private static class MyTaskParams {
int id;
int answer;
int q;
MyTaskParams(int id, int answer, int q) {
this.id = id;
this.answer = answer;
this.q = q;
}
}
// update
private static class addAsyncTask extends AsyncTask<MyTaskParams, Void, Void>{
private AppDatabase db;
addAsyncTask(AppDatabase appDatabase) {
db = appDatabase;
}
@Override
protected Void doInBackground(MyTaskParams...params){
int id = params[0].id;
int answer = params[0].answer;
int q = params[0].q;
switch (q) {
case (1):
db.surveyDao().answer1(id, answer);
case (2):
db.surveyDao().answer2(id, answer);
case (3):
db.surveyDao().answer3(id, answer);
case (4):
db.surveyDao().answer4(id, answer);
case (5):
db.surveyDao().answer5(id, answer);
case (6):
db.surveyDao().answer6(id, answer);
case (7):
db.surveyDao().answer7(id, answer);
case (8):
db.surveyDao().answer8(id, answer);
case (9):
db.surveyDao().answer9(id, answer);
case (10):
db.surveyDao().answer10(id, answer);
case (11):
db.surveyDao().answer11(id, answer);
case (12):
db.surveyDao().answer12(id, answer);
case (13):
db.surveyDao().answer13(id, answer);
case (14):
db.surveyDao().answer14(id, answer);
case (15):
db.surveyDao().answer15(id, answer);
}
return null;
}
}