Чтение и отображение значений из SQLite и сохранение их в списке

#java #android #sql #sqlite #android-studio

Вопрос:

Я пытаюсь прочитать и отобразить все данные из своей базы данных, но получаю следующую ошибку. Кроме того, в окне просмотра вторсырья не отображаются какие-либо данные.

Как я читаю из базы данных.

 public ArrayListlt;SatelliteFormgt; getAllData(SQLiteDatabase sqLiteDatabase){  ArrayListlt;SatelliteFormgt; arraySatelite = new ArrayListlt;gt;();  sqLiteDatabase = this.getWritableDatabase();  String SELECT_QUERY = "select name, country, category from "   SatFormContracts.ContactsEntry.TABLE_NAME   ";";  Cursor c = sqLiteDatabase.rawQuery(SELECT_QUERY, null);  if(c.moveToFirst()){  while(c.moveToNext()){  SatelliteForm form = new SatelliteForm();  form.setName(c.getString(1));  form.setCountry(c.getString(2));  form.setCategory(c.getString(3));  arraySatelite.add(form);  Log.i("nameSQL", c.getString(1)   ""   c.getString(2)   ""   c.getString(3));  }  }  c.close();  return arraySatelite;  }  

Как я добавляю элементы в базу данных.

 public void onClick(View view) {  if(!(satName.getText().toString().isEmpty() || countryName.getText().toString().isEmpty() || categoryName.getText().toString().isEmpty())){  //adds the current names into the constructor  SatelliteForm addForm = new SatelliteForm(satName.getText().toString(),  categoryName.getText().toString(),  countryName.getText().toString());  //inserts the values  dbHelper.insertContact(db, addForm);  saveState.setText("Saved!");  }else{  saveState.setText("One or all the fields are empty");  Log.i("Campos", "Unos de los campos esta vacio");  }  }  });  

Как я пытаюсь отобразить данные, сохраненные в списке.

 public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {  View listView = inflater.inflate(R.layout.fragment_list, container, false);   ArrayListlt;SatelliteFormgt; arraySatelite = dbHelper.getAllData(db);   RecyclerView recyclerView = listView.findViewById(R.id.recyclerView);  RecyclerViewAdapter adapter = new RecyclerViewAdapter(arraySatelite);  recyclerView.setAdapter(adapter);  recyclerView.setLayoutManager(new LinearLayoutManager((getContext())));  recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));   return listView; }  

Класс, в котором я сохраняю все свои данные.

 public class SatelliteForm {  private String name;  private String country;  private String category;  private ArrayListlt;Stringgt; names;  private Listlt;Stringgt; list;   //Empty constructor  public SatelliteForm(){}  //Construtcor  public SatelliteForm(String name, String country, String category){  this.name = name;  this.country = country;  this.category = category;  this.names = names;  addNames(name, country, category);  }  //Method which adds the variables to an array  public void addNames(String name, String country, String category) {  list = Arrays.asList(name, country, category);  names = new ArrayListlt;gt;(list);  }  //Getters amp; Setters  public ArrayListlt;Stringgt; getArray(){  return names;  }  public String getName() { return name; }  public String getCountry() { return country; }  public String getCategory() { return category; }  public void setName(String name) { this.name = name; }  public void setCountry(String country) { this.country = country; }  public void setCategory(String category) { this.category = category; } }  

ошибка: [![ошибка][1]][1] [1]: https://i.stack.imgur.com/eyHoY.png

 E/CursorWindow: Failed to read row 0, column 3 from a CursorWindow which has 4 rows, 3 columns. D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main  Process: com.example.uspherejda, PID: 7434  java.lang.IllegalStateException: Couldn't read row 0, col 3 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.  

Ответ №1:

Вы должны начать с 0 и считать до. Я вижу, что вы начинаете с 1, и вот где это неправильно.

Попробуйте заменить getString(1) на getString(0) .

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

1. Я думал о том же, но если я начну с 0, разве я не буду хранить идентификатор? Вот почему я начал с 1.

2. @noobieCoder запрос таков: select name, country, category from ... . В возвращаемых столбцах нет идентификатора.

3. как объяснил forpas, вы не используете идентификатор в запросе, поэтому вам нужно начинать с 0 . Когда курсор пуст и он выдаст ошибку

4. @RafalA Pepega момент рядом со мной.