私はこのウェブサイトで回答を検索しましたが見つかりませんでした。私は以下のエラーのために私のアプリケーションを実行することはできません。助けてください!Android:CursorIndexOutOfBoundsException:0が要求され、0のサイズで、サイトに回答がありません
MainActivity.java
public class MainActivity extends AppCompatActivity {
private MeusLivrosListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prepararBotoes();
listarLivros();
prepararCampoBusca();
}
private void listarLivros() {
MeusLivrosDBManganer dbManganer = new MeusLivrosDBManganer(getApplicationContext());
List<Livro> livros = dbManganer.recuperarListaLivros();
adapter = new MeusLivrosListAdapter(livros, this);
ListView lista = (ListView) findViewById(R.id.listaDeLivros);
lista.setAdapter(adapter);
}
private void prepararBotoes() {
Button btnAdicionar = (Button) findViewById(R.id.btn_adicionar);
btnAdicionar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AdicionarActivity.class);
startActivity(intent);
}
});
}
private void prepararCampoBusca() {
EditText txtPesquisar = (EditText) findViewById(R.id.txt_pesquisar);
if (txtPesquisar != null) {
txtPesquisar.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (count < before) {
// Reseta a lista
adapter.resetData();
}
adapter.getFilter().filter(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}
}
MeusLivrosDBManganerは
public class MeusLivrosListAdapter extends ArrayAdapter<Livro> implements Filterable {
private List<Livro> listaDeLivros;
private Context context;
private Filter livroFilter;
private List<Livro> listaDeLivrosOriginal;
public MeusLivrosListAdapter(List<Livro> planetList, Context ctx) {
super(ctx, R.layout.layout_lista_livros, planetList);
this.listaDeLivros = planetList;
this.context = ctx;
this.listaDeLivrosOriginal = planetList;
}
public int getCount() {
return listaDeLivros.size();
}
public Livro getItem(int position) {
return listaDeLivros.get(position);
}
public long getItemId(int position) {
return listaDeLivros.get(position).hashCode();
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
LivrosHolder holder = new LivrosHolder();
//Verifica se a view está nula
if (convertView == null) {
// recupera a view
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.layout_lista_livros, null);
//recupera os campos da view
TextView idLivro = (TextView) v.findViewById(R.id.idLivro);
TextView tituloLivro = (TextView) v.findViewById(R.id.tituloLivro);
holder.livroIDView = idLivro;
holder.livroTituloView = tituloLivro;
v.setTag(holder);
}
else
holder = (LivrosHolder) v.getTag();
Livro l = listaDeLivros.get(position);
holder.livroIDView.setText(String.valueOf(l.id));
holder.livroTituloView.setText(String.valueOf(l.titulo));
return v;
}
public void resetData() {
listaDeLivros = listaDeLivrosOriginal;
}
/* *********************************
* Usamos o padrão holder
* Isto deixa a view mais rápida, pois evita ficar procurando o componente
* **********************************/
private static class LivrosHolder {
public TextView livroIDView;
public TextView livroTituloView;
}
/*
* Criamos nosso filtro
*/
@Override
public Filter getFilter() {
if (livroFilter == null)
livroFilter = new LivroFilter();
return livroFilter;
}
private class LivroFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
// Implementamos a lógica do filtro
if (constraint == null || constraint.length() == 0) {
//sem filtros, retorna a lista toda
results.values = listaDeLivrosOriginal;
results.count = listaDeLivrosOriginal.size();
}
else {
// Executamos a opração de filtragem
List<Livro> nLivroList = new ArrayList<>();
for (Livro p : listaDeLivros) {
if (p.titulo.toUpperCase().contains(constraint.toString().toUpperCase()))
nLivroList.add(p);
}
results.values = nLivroList;
results.count = nLivroList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
// informamos ao adapter sobre a nova lista filtrada
if (results.count == 0)
notifyDataSetInvalidated();
else {
listaDeLivros = (List<Livro>) results.values;
notifyDataSetChanged();
}
}
}
}
MeusLivrosListAdapter
public class MeusLivrosDBManganer {
private MeusLivrosDBHelper dbHelper;
public MeusLivrosDBManganer(Context ctx) {
dbHelper = new MeusLivrosDBHelper(ctx);
}
public Cursor recuperarLivros() {
String[] campos = {
MeusLivrosDBContract.Livro.COLUMN_NAME_ID,
MeusLivrosDBContract.Livro.COLUMN_NAME_TITULO,
MeusLivrosDBContract.Livro.COLUMN_NAME_AUTOR,
MeusLivrosDBContract.Livro.COLUMN_NAME_EDITORA
};
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = db.query(MeusLivrosDBContract.Livro.TABLE_NAME, campos, null, null, null, null, null);
db.close();
return c;
}
public List<Livro> recuperarListaLivros() {
List<Livro> livros = new ArrayList<>();
Cursor c = this.recuperarLivros();
do {
Livro l = new Livro();
l.id = c.getInt(c.getColumnIndex(MeusLivrosDBContract.Livro.COLUMN_NAME_ID));
l.titulo = c.getString(c.getColumnIndex(MeusLivrosDBContract.Livro.COLUMN_NAME_TITULO));
l.autor = c.getString(c.getColumnIndex(MeusLivrosDBContract.Livro.COLUMN_NAME_AUTOR));
l.editora = c.getString(c.getColumnIndex(MeusLivrosDBContract.Livro.COLUMN_NAME_EDITORA));
livros.add(l);
}while (c.moveToNext());
return livros;
}
public boolean inserirLivro(Livro livro) {
ContentValues values = new ContentValues();
values.put(MeusLivrosDBContract.Livro.COLUMN_NAME_AUTOR, livro.autor);
values.put(MeusLivrosDBContract.Livro.COLUMN_NAME_EDITORA, livro.editora);
values.put(MeusLivrosDBContract.Livro.COLUMN_NAME_TITULO, livro.titulo);
SQLiteDatabase db = dbHelper.getWritableDatabase();
long resultado = db.insert(MeusLivrosDBContract.Livro.TABLE_NAME, null, values);
db.close();
return resultado != -1;
}
}
アダプタを.JAVA
java.lang.RuntimeException:活性ComponentInfo {com.juliosampaio.meuslivros/com.juliosampaio.meuslivros.MainActivity}を開始できません:android.database.CursorIndexOutOfBoundsException:インデックス0 android.appで0 のサイズと、要求されました.ActivityThread.performLaunchActivity android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)で(ActivityThread.java:2416) android.app.ActivityThread.-wrap11(ActivityThread.java) でのandroid.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) とandroid.os.Handler.dispatchMessage(Handler.java:102) とandroid.os.Looper.loop(Looper.java:1) 48) android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit .java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:android.database.CursorIndexOutOfBoundsException:アンドロイドデータベースのサイズが0であるのインデックス0が要求されました。 AbstractCursor.checkPosition(AbstractCursor.java:460)android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)の android.database.AbstractWindowedCursor.getInt(AbstractWind owedCursor.java:68)com.juliosampaio.meuslivrosでcom.juliosampaio.meuslivros.MainActivity.listarLivros(MainActivity.java:33でcom.juliosampaio.meuslivros.MeusLivrosDBManganer.recuperarListaLivros(MeusLivrosDBManganer.java:47) で) 。 MainActivity.onCreate(MainActivity.java:27)
あなたは 'recuperarLivros()'メソッドから得ているカーソルが空であると思われます。私はまた、データbeseヘルパークラスがデータベース名で呼び出されないことに気づいた!あなたはdatabeseで一致するコンテンツを持っていると確信していますか?カーソルを使って作業するとき、 'if(cursor.moveToFirtst())'ステートメントを使うのは常に実用的です。 –
MeusLivrosDBManager.javaの行47には、列名の静的な値がデータベースと正確に一致していることを確認してください。 –