Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 终结尚未停用或关闭的游标_Android_Sqlite_Cursor - Fatal编程技术网

Android 终结尚未停用或关闭的游标

Android 终结尚未停用或关闭的游标,android,sqlite,cursor,Android,Sqlite,Cursor,好的,我是android开发的新手,或者任何开发都会遇到这个错误。我试图做的是每次用户选择一个微调器项目,然后程序创建一个列表。我有一个DatabaseHelper类,用于获取列表的结果。但问题是,它永远不会创建列表,并且它会给出这个错误 活动使用的DatabaseHelper方法 public int[] searchbyLetter(String letter) { // TODO Auto-generated method stub int[] results = new

好的,我是android开发的新手,或者任何开发都会遇到这个错误。我试图做的是每次用户选择一个微调器项目,然后程序创建一个列表。我有一个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;
}
这是我的活动课

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();


}
public类扩展了ListActivity{
字符串[]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;
无翅目无翅目;
纺纱机;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏,
WindowManager.LayoutParams.FLAG(全屏);
setContentView(R.layout.az);
ArrayAdapter spAzAdpt=新的ArrayAdapter(Az.this,
android.R.layout.simple_spinner_item,spAzPaht);
spAZ=(微调器)findviewbyd(R.id.spAZ);
spAZ.setAdapter(spAzAdpt);
azOrder=新的ArrayList();
this.azOrderAdapter=新的azOrderAdapter(Az.this,R.layout.Az,azOrder);
setListAdapter(azOrderAdapter);
spAZ.setOnItemSelectedListener(新的OnItemSelectedListener(){
已选择公共视图(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
getSearchs();
}
未选择公共无效(AdapterView arg0){
//TODO自动生成的方法存根
getSearchs();
}
});
}
私有void getSearches(){
DatabaseHelper myDBHelper=新的DatabaseHelper(Az.this);
试一试{
myDBHelper.createDataBase();
}捕获(IOE异常){
//TODO:处理异常
e、 printStackTrace();
}
试一试{
myDBHelper.openDataBase();
}捕获(SQLException sqle){
抛出sqle;
//TODO:处理异常
}
int position=spAZ.getSelectedItemPosition();
字符串字母=spAzPaht[位置];
int[]results=myDBHelper.searchbyLetter(字母);
试一试{
azOrder=新的ArrayList();
AzOrder AZO=新的AzOrder();
for(int i=0;i
这就是我得到的错误

    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)
E/Cursor(295):结束尚未停用或禁用的游标
closed.database=/data/data/com.mineralidentifier.degosa.test1/databases/
矿物,表=矿物,查询=从矿物中选择矿物\u名称
其中_id=0
E/Cursor(295):android.database.sqlite.DatabaseObjectNotClosedException:
应用程序未关闭已打开的游标或数据库对象
在这里
E/Cursor(295):位于android.database.sqlite.SQLiteCursor。
(SQLiteCursor.java:210)
E/Cursor(295):位于android.database.sqlite.SQLiteDirectCursorDriver.query
(SQLiteDirectCursorDriver.java:53)

看起来光标没有被关闭。我看到你有c.close(),但可能无法到达它,因为在它之前正在抛出另一个异常。并且,该异常被DatabaseObjectNotClosedException屏蔽,最终被抛出,屏蔽了原始异常。最好将其包装在finally子句中,以确保无论是否抛出异常,它始终处于关闭状态

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

如果您这样做,那么它可能会告诉您真正的问题是什么。不幸的是,由于我们没有看到完整异常的堆栈跟踪,我们无法看到DatabaseObjectNotClosedException在您的代码中从何处抛出。我们只能看到它从android代码中的何处抛出,但我们无法看到过去的SQLiteDirectCursorDriver.query。

ike光标没有被关闭。我看到你有c.close(),但可能无法到达它,因为在它之前正在抛出另一个异常。并且,该异常被DatabaseObjectNotClosedException屏蔽,最终被抛出,屏蔽了原始异常。最好将其包装在finally子句中,以确保无论是否抛出异常,它始终处于关闭状态

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

如果您这样做,那么它可能会告诉您真正的问题是什么。不幸的是,由于我们没有看到完整异常的stacktrace,我们无法看到DatabaseObjectNotClosedException在您的代码中从何处抛出。我们只能看到它从android代码中的何处抛出,但我们无法看到过去的SQLiteDirectCursorDriver.query。

问题是什么错误?Stacktrace将非常有用。您是否正在尝试实现自动完成功能?@chubbard我编辑我的问题,在我的数据库中没有_id=0的条目。自动完成功能是什么意思?我想做的是从我的数据库中创建一个-Z列表,我有一个附加列用于检查字母。在listActivity spinner中,每个lette都有字母表中的r。当我选择一个字母时,我的微调器下方的listview会发生变化,并给出结果。有什么错误?Stacktrace会非常有用。你是否正在尝试实现自动完成功能?@chubbard我编辑我的问题,在我的db中没有带_id=0的条目。你对自动完成功能的意思是什么?我说什么nt要做的是我的数据库中的A-Z列表,我有一个附加列用于检查字母。在listActivity微调器中,字母表中的每个字母都有。当我选择一个字母时,微调器下面的listview会发生变化,并给出结果。是的,我收到了这个错误W/System.err(659):android.database.CursorIn