【问题标题】:The method is undefined in fragment android spinner sqlite该方法在片段android spinner sqlite中未定义
【发布时间】:2026-01-30 03:50:02
【问题描述】:

我有一个旋转器。我想从 sqlite 加载数据。我尝试使用 Activity 类加载数据,它可以工作,但我想在 Fragment 类中加载它,我得到的方法是未定义的。有什么不对吗?我该怎么办??

对不起我的英语不好..

这是片段类

public class InfoJadwal extends Fragment {
private DatabaseHandler dbhelper;
private SQLiteDatabase db = null;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {


    super.onActivityCreated(savedInstanceState);
        dbhelper = new DatabaseHandler(getActivity());
    db = dbhelper.getWritableDatabase();
    dbhelper.delAllData(db);
    dbhelper.generateData(db);
        View rootView = inflater.inflate(R.layout.info_jadwal, container,
                false);

    loadDataSpinner();

    return rootView;
}

private void loadDataSpinner() {
    Cursor wisataCursor;
    Spinner colourSpinner = (Spinner) getView().findViewById(
            R.id.spin_tujuan);
    wisataCursor = dbhelper.fetchAllWisata(db);

    startManagingCursor(wisataCursor);

    String[] from = new String[] { dbhelper.TUJUAN };

    int[] to = new int[] { R.id.tvDBViewRow };

    SimpleCursorAdapter wisataAdapter = new SimpleCursorAdapter(this,
            R.layout.db_view_row, wisataCursor, from, to);

    colourSpinner.setAdapter(wisataAdapter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        try {
            db.close();
        } catch (Exception e) {

        }
    }

}

这是 DatabaseHandler 的类。

public class DatabaseHandler extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "medantrain";
public static final String TUJUAN = "tujuan";
public static final String KEY_ID = "_id";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

// method createTable untuk membuat table WISATA
public void createTable(SQLiteDatabase db) {
    db.execSQL("DROP TABLE IF EXISTS KOTA");
    db.execSQL("CREATE TABLE if not exists KOTA (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
            + "TUJUAN TEXT);");
}

// method generateData untuk mengisikan data ke table Wisata.
public void generateData(SQLiteDatabase db) {
    ContentValues cv = new ContentValues();
    cv.put(TUJUAN, "Binjai");
    db.insert("KOTA", TUJUAN, cv);
    cv.put(TUJUAN, "Rantau Prapat");
    db.insert("KOTA", TUJUAN, cv);
    cv.put(TUJUAN, "Tebing Tinggi");
    db.insert("KOTA", TUJUAN, cv);
}

// method delAllAdata untuk menghapus data di table Wisata.
public void delAllData(SQLiteDatabase db) {
    db.delete("KOTA", null, null);
}

public Cursor fetchAllWisata(SQLiteDatabase db) {
    return db.query("KOTA", new String[] { KEY_ID, TUJUAN }, null, null,
            null, null, null);
}

@Override
public void onCreate(SQLiteDatabase db) {
    createTable(db);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}
}

【问题讨论】:

  • 哪个方法未定义?
  • 你能分享你的日志文件/错误行号
  • 这个方法是错误的 startManagingCursor(wisataCursor);而这个 SimpleCursorAdapter wisataAdapter = new SimpleCursorAdapter(this, R.layout.db_view_row, wisataCursor, from, to); colourSpinner.setAdapter(wisataAdapter); }

标签: android sqlite android-fragments spinner


【解决方案1】:

替换

SimpleCursorAdapter wisataAdapter = new SimpleCursorAdapter(this,R.layout.db_view_row, wisataCursor, from, to);

SimpleCursorAdapter wisataAdapter = new SimpleCursorAdapter(getActivity(),R.layout.db_view_row, wisataCursor, from, to);

替换

startManagingCursor(wisataCursor);

getActivity().startManagingCursor(wisataCursor);

Activity 中的 startManagingCursor(Cursor) 已弃用。有关更多信息,请参阅文档http://developer.android.com/reference/android/app/Activity.html#startManagingCursor%28android.database.Cursor%29

SimpleCursorAdapter 需要 Context 引用,但您传递的是 this,这意味着 Fragment 引用。

【讨论】:

  • 谢谢先生,但我知道这个方法也是错误的.. startManagingCursor(wisataCursor);
  • 非常感谢先生。我忘记了这个小代码。我不推荐使用这些方法,但没关系。