2016-06-19 12 views
-1

私はこのウェブサイトで回答を検索しましたが見つかりませんでした。私は以下のエラーのために私のアプリケーションを実行することはできません。助けてください!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)

+0

あなたは 'recuperarLivros()'メソッドから得ているカーソルが空であると思われます。私はまた、データbeseヘルパークラスがデータベース名で呼び出されないことに気づいた!あなたはdatabeseで一致するコンテンツを持っていると確信していますか?カーソルを使って作業するとき、 'if(cursor.moveToFirtst())'ステートメントを使うのは常に実用的です。 –

+0

MeusLivrosDBManager.javaの行47には、列名の静的な値がデータベースと正確に一致していることを確認してください。 –

答えて

1

主な原因は、カーソルにデータがないことです。条件を確認するまで確認できません。 doループは条件をチェックせずに1回実行し、1回だけ実行した後で条件をチェックします。

だから私はクラッシュを防止するために、カーソルをループしながら、あなたが使用したい場合はそれは常により良いこの

while (cursor.moveToNext()) { 
    ... 
} 

OR

のようにやっている、

do whileループを使用していないお勧めdo whileループの場合、ループする前にif (cursor.moveToFirst())をチェックしてください。

if (cursor.moveToFirst()) { 
    do { 
     ...     
    } while (cursor.moveToNext()); 
}