android.database.StaleDataException : Access closed cursor

标签 android android-sqlite android-cursoradapter staledataexception

我有主 Activity、一个 SQLiteOpenHelper 类和一个 Fragment,我必须在其中获取包含数据库数据的 Cursor。

在我的主要 Activity 中,我作为静态公共(public)成员存储和启动数据库:

public class Main extends FragmentActivity {
    public static Main MainActivity;
    public static DBHelper Database;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        MainActivity = this;
        Database = new Database(getApplicationContext(), "db_test", null, 1);
    }
}

这是我的数据库类的样子:

public class DBHelper extends SQLiteOpenHelper {
    public static final String MAIN_TABLE = "tbl_list";

    public DBHelper(Context c, String n, CursorFactory f, int v) {
        super(c, n, f, v);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
            "CREATE TABLE IF NOT EXISTS " + MAIN_TABLE + " (" + 
            "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
            "name VARCHAR (64) NOT NULL, " + 
            "status TEXT DEFAULT NULL " + 
            ")"
        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    }
}

在我的 fragment 中,我试图检索包含所有记录的列表:

public class MyFrag extends Fragment {
    private DBHelper db;

    @Override
    public View onCreateView(LayoutInflater i, ViewGroup v, Bundle b) {
        db = Main.Database.getWritableDatabase();
    }

    private void showList() {
        ListView list_view= new ListView(Main.MainActivity);
        String[] data = { "_id", "name", "status" };
        Cursor c = db.query(Database.TASKS_TABLE, data, null, null, null, null, null);

        c.moveToFirst();

        if (c.getCount() > 0) {
            String[] columns = new String[] { "name", "status" };
            int[] views = new int[] { 
                R.id.item_name, 
                R.id.item_status
            };
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                Main.MainActivity, 
                R.layout.mylist, 
                c, 
                columns, 
                views, 
                0
            );
            list_view.setAdapter(adapter);
        }
    }
}

当我运行该应用程序时出现此错误:android.database.StaleDataException: Access closed cursor

最佳答案

您没有打开与数据库的连接,因此您无法访问它,您必须添加一个打开数据库的方法,并在完成操作后关闭它

关于android.database.StaleDataException : Access closed cursor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24700126/

相关文章:

java - 如何在 android studio 中调用已编译的 jar 文件的 java 类?

java - 使用 eventBus 从特定 Activity 中清除堆栈 Activity

java - Android Sqlite 操作

java - 自定义ListView不显示

java - Android VideoView 在 onPrepared 中崩溃

java - 列表返回方法返回一个空列表(尽管列表已填充)

android - 仅查询表中的第一条数据

android - 神秘错误 : "Failed to open database phenotype.db, database is locked." Can't find any info online

android - 滚动后如何保持android复选框状态

android - CursorAdapter 中的 setFilterQueryProvider() 和 runQueryOnBackgroundThread() 有什么区别?