2012-01-17 10 views
1

これは、アンドロイド開発、または開発中で、このエラーが発生したために新規です。私は毎回ユーザーがスピナー項目を選択してから、プログラムがリストを作成することを試みています。私はリストの結果を得るために使用しているDatabaseHelperクラスを持っています。しかし、問題はそれが決してリストを作成することではなく、このエラーになります。非アクティブ化またはクローズされていないカーソルのファイナライズ

DatabaseHelperアクティビティが使用するメソッド。

public int[] searchbyLetter(String letter) { 
    // TODO Auto-generated method stub 
    int[] results = new int[100]; 
    int count = 0; 

    String[] columns = new String[] { KEY_MINERALID }; 
    Cursor c = minerals.query(DATABASE_TABLE, columns, KEY_LETTER + "= '" 
      + letter + "'", null, null, null, null); 
    if (c.moveToFirst()) { 
     results[count] = c.getInt(c.getColumnIndex(KEY_MINERALID)); 
    } 

    while (c.moveToNext()) { 
     count++; 
     results[count] = c.getInt(c.getColumnIndex(KEY_MINERALID)); 
    } 
    c.close(); 
    return results; 
} 

public String getName(int _id) { 
    // TODO Auto-generated method stub 
    String[] columns = new String[] { KEY_NAME }; 
    Cursor c = minerals.query(DATABASE_TABLE, columns, KEY_MINERALID + "=" 
      + _id, null, null, null, null); 
    c.moveToFirst(); 
    int iName = c.getColumnIndex(KEY_NAME); 
    String result = c.getString(iName); 
    c.close(); 
    return result; 
} 

このmy ListActivityクラス。

public class Az extends ListActivity { 

String[] spAzPaht = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
     "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", 
     "Y", "Z" }; 
ArrayList<AzOrder> azOrder; 
AzOrderAdapter azOrderAdapter; 
Spinner spAZ; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.az); 
    ArrayAdapter<String> spAzAdpt = new ArrayAdapter<String>(Az.this, 
      android.R.layout.simple_spinner_item, spAzPaht); 

    spAZ = (Spinner) findViewById(R.id.spAZ); 
    spAZ.setAdapter(spAzAdpt); 
    azOrder = new ArrayList<AzOrder>(); 
    this.azOrderAdapter = new AzOrderAdapter(Az.this, R.layout.az, azOrder); 
    setListAdapter(azOrderAdapter); 

    spAZ.setOnItemSelectedListener(new OnItemSelectedListener() { 

     public void onItemSelected(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 

      getSearches(); 

     } 

     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 

      getSearches(); 

     } 
    }); 

} 


private void getSearches() { 
    DatabaseHelper myDBHelper = new DatabaseHelper(Az.this); 

    try { 
     myDBHelper.createDataBase(); 
    } catch (IOException e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    } 
    try { 
     myDBHelper.openDataBase(); 
    } catch (SQLException sqle) { 
     throw sqle; 
     // TODO: handle exception 
    } 
    int position = spAZ.getSelectedItemPosition(); 
    String letter = spAzPaht[position]; 
    int[] results = myDBHelper.searchbyLetter(letter); 

    try { 

     azOrder = new ArrayList<AzOrder>(); 
     AzOrder AZO = new AzOrder(); 
     for (int i = 0; i < results.length; i++) { 
      AZO.setName(myDBHelper.getName(results[i])); 
      AZO.setMineral_ID(results[i]); 
      azOrder.add(AZO); 
     } 
     Thread.sleep(5000); 
     Log.i("Array", "" + azOrder.size()); 
    } catch (Exception e) { 
     // TODO: handle exception 
     Log.e("BACKGROUND_PROC", e.getMessage()); 
    } 
    myDBHelper.close(); 


} 

カーソルがクローズされていないようにこれは私が

E/Cursor(295): Finalizing a Cursor that has not been deactivated or 
    closed. database = /data/data/com.mineralidentifier.degosa.test1/databases/ 
    minerals, table = minerals, query = SELECT minerals_name FROM minerals 
    WHERE _id=0 

    E/Cursor(295): android.database.sqlite.DatabaseObjectNotClosedException: 
    Application did not close the cursor or database object that was opened 
    here 

    E/Cursor(295): at android.database.sqlite.SQLiteCursor.<init> 
    (SQLiteCursor.java:210) 

    E/Cursor(295): at android.database.sqlite.SQLiteDirectCursorDriver.query 
    (SQLiteDirectCursorDriver.java:53) 
+0

エラーは何ですか? Stacktraceが最も役立ちます。オートコンプリート機能を実装しようとしていますか? – chubbsondubs

+0

@chubbard私は自分の質問を編集していますが、dbでは_id = 0のエントリがありません。オートコンプリート機能とはどういう意味ですか?私がやりたいことは、私のデータベースのA - Zリストです。私は手紙をチェックするための追加の列を持っています。 listActivityのスピンナーにはアルファベットのすべての文字があります。私は手紙を選択するときにしようとしている、私のリストビューは、スピナーの変更の下で、結果を与える。 – Degosa

答えて

1

を取得していますエラーが見えています。私はあなたがc.close()を持っているのを見ていますが、それ以前に別の例外がスローされているために到達しないかもしれません。そして、その例外はDatabaseObjectNotClosedExceptionによってマスクされ、元のマスクにマスクされて終了します。 finally句でそれをラップして、例外がスローされたかどうかに関係なく常に閉じられるようにするのが最善です。

これを実行すると、実際の問題点がわかります。残念ながら、完全な例外のスタックトレースは表示されないため、コード内でDatabaseObjectNotClosedExceptionがどこからスローされたかはわかりません。アンドロイドコードのどこからスローされたかしかわかりませんが、過去のSQLiteDirectCursorDriver.queryは見ることができません。

+0

ええ、私はこのエラーを取得していますW/System.err(659):android.database.CursorIndexOutOfBoundsException:0が要求され、サイズは0です。 – Degosa

関連する問題