2012-01-17 2 views
1

Хорошо, я новичок в разработке Android или любой разработке и получении этой ошибки. Я пытаюсь сделать каждый раз, когда пользователь выбирает элемент spinner, а затем создает список. У меня есть класс 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; 
} 

Это мой класс 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 spinner есть каждая буква в алфавите. Я пытаюсь сделать, когда я выбираю письмо, мой список, который ниже изменения счетчика, и дает результат. – Degosa

ответ

1

Похоже, курсор не закрывается. Я вижу, что у вас есть c.close(), но может не дойти до него, потому что перед ним бросается другое исключение. И это исключение маскируется приложением DatabaseObjectNotClosedException, которое бросается в маскировку исходного. Лучше всего обернуть это в предложении finally, чтобы гарантировать, что он всегда закрыт независимо от того, какое исключение выбрано или нет.

Cursor c = ... 
try { 
    ... 
} finally { 
    c.close(); 
} 

Если вы это сделаете, это может рассказать вам, что представляет собой настоящая проблема. К сожалению, так как мы не видим стек стека полного исключения, мы не можем видеть, откуда именно именно вызывается код DatabaseObjectNotClosedException. Мы можем видеть только, где в коде Android, из которого он выведен, но мы не можем увидеть предыдущий SQLiteDirectCursorDriver.query.

+0

Да, я получаю эту ошибку W/System.err (659): android.database.CursorIndexOutOfBoundsException: запрошен индекс 0, с размером 0. – Degosa

Смежные вопросы