#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 момент рядом со мной.