由光标列表视图中显示的数据 [英] show data in list view by cursor

查看:86
本文介绍了由光标列表视图中显示的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个程序,可以显示的数据存储在数据库中的列表视图通过cursor.but在运行时,它给了我力量close.I阅读logcat的,但我不明白,这是什么error.I给我的code和logcat.please帮我

current_cart code:

 公共类current_cart扩展ListActivity {

    私人的ListView mainListView = NULL;
    CustomSqlCursorAdapter适配器= NULL;
    私人把SqlHelper dbHelper = NULL;
    私人光标currentCursor = NULL;

    私人的ListView ListView控件= NULL;

    / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.current_cart);

        如果(this.dbHelper == NULL){
            this.dbHelper =新把SqlHelper(本);

        }

        ListView控件= getListView();
        listView.setItemsCanFocus(假);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        //listView.setClickable(true);

        按钮btnClear =(按钮)findViewById(R.id.btnClear);
        btnClear.setOnClickListener(新OnClickListener(){

            公共无效的onClick(视图v){
                Toast.makeText(getApplicationContext(),
                        你点击清除按钮,Toast.LENGTH_SHORT).show();
              // ClearDBSelections();
            }
        });

        新SelectDataTask()执行()。

        this.mainListView = getListView();

        mainListView.setCacheColorHint(0);

    }

    @覆盖
    保护无效onRestart(){
        super.onRestart();
        新SelectDataTask()执行()。
    }

    @覆盖
    保护无效的onPause(){

        super.onPause();
        this.dbHelper.close();
    }

  //保护无效ClearDBSelections(){

      // this.adapter.ClearSelections();

  //}

    私有类SelectDataTask扩展的AsyncTask<虚空,虚空,字符串> {

        保护字符串doInBackground(空... PARAMS){

            尝试 {

                current_cart.this.dbHelper.createDatabase(dbHelper.dbSqlite);
                current_cart.this.dbHelper.openDataBase();

                current_cart.this.currentCursor = current_cart.this.dbHelper
                        .getCursor();

            }
            赶上(的SQLException SQLE)
            {

                扔SQLE;

            }
            返回null;
        }

        //这里可以使用UI线程
        保护无效onPostExecute(最后弦乐结果){

            startManagingCursor(current_cart.this.currentCursor);
            INT [] listFields =新INT [] {R.id.txtTitle,R.id.txtprice};
            的String [] dbColumns =新的String [] {SqlHelper.COLUMN_TITLE,SqlHelper.COLUMN_NAME_DESC};

            current_cart.this.adapter =新CustomSqlCursorAdapter(
                    current_cart.this,R.layout.single_item,
                    current_cart.this.currentCursor,dbColumns,listFields,
                    current_cart.this.dbHelper);
            setListAdapter(current_cart.this.adapter);

        }
    }

}
 

CustomSqlCursorAdapter code:

 公共类CustomSqlCursorAdapter扩展SimpleCursorAdapter {
    私人语境mContext;

    私人把SqlHelper mDbHelper;
    私人光标mCurrentCursor;

    公共CustomSqlCursorAdapter(上下文的背景下,INT布局,光标C,
            的String []从[]为INT,把SqlHelper dbHelper){
        超(背景下,布局,C,从,到);
        this.mCurrentCursor = C;
        this.mContext =背景;
        this.mDbHelper = dbHelper;

    }

    公共查看getView(INT POS,查看inView,ViewGroup中父){
        视图V = inView;
        如果(V == NULL){
            LayoutInflater充气=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            V = inflater.inflate(R.layout.single_item,NULL);
        }

        如果(!this.mCurrentCursor.moveToPosition(POS)){
            抛出新的SQLException(CustomSqlCursorAdapter.getView:无法移动到的位置是:+ POS);
        }

        复选框的CBox =(复选框)v.findViewById(R.id.bcheck);


        cBox.setTag(Integer.valueOf(this.mCurrentCursor.getInt(0)));


        cBox.setOnCheckedChangeListener(新OnCheckedChangeListener(){

            公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){


            }
        });

        TextView的txtTitle =(TextView中)v.findViewById(R.id.txtTitle);
        txtTitle.setText(this.mCurrentCursor.getString(this.mCurrentCursor
                .getColumnIndex(SqlHelper.COLUMN_TITLE)));
        TextView的txtprice =(TextView中)v.findViewById(R.id.txtprice);
        txtprice.setText(this.mCurrentCursor.getString(this.mCurrentCursor
                .getColumnIndex(SqlHelper.COLUMN_NAME_DESC)));

        返回(V);
    }


}
 

把SqlHelper code:

 公共类把SqlHelper扩展SQLiteOpenHelper {
        私有静态最后弦乐DATABASE_PATH =/data/data/com.example.bb/databases/;

        公共静态最后弦乐DATABASE_NAME =LL;

        公共静态最后弦乐TABLE_NAME =W;
        公共静态最终诠释ToDoItems_VERSION = 1;

       //公共静态最后弦乐COLUMN_ID =_id;
        公共静态最后弦乐COLUMN_TITLE =Good_Name;
       公共静态最后弦乐COLUMN_NAME_DESC =Good_UnitPrice;


        公共SQLiteDatabase dbSqlite;
        私人语境mContext;

        公众把SqlHelper(上下文的背景下){
            超级(上下文,DATABASE_NAME,空,1);
            mContext =背景;
        }

        @覆盖
        公共无效的onCreate(SQLiteDatabase DB){
            CREATEDB(DB);
        }

        @覆盖
        公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
            Log.w(把SqlHelper,从版本升级数据库+ oldVersion
                    +到+动态网页+,这将销毁所有旧数据);

            db.execSQL(DROP TABLE IF EXISTS瓦;);

            CREATEDB(DB);
        }

        公共无效的CreateDatabase(SQLiteDatabase DB){
            CREATEDB(DB);
        }

        私人无效CREATEDB(SQLiteDatabase DB){
            如果(DB == NULL){
                DB = mContext.openOrCreateDatabase(DATABASE_NAME,0,NULL);
            }

            db.execSQL(CREATE TABLE IF NOT EXISTS W(Cart_ID INTEGER,Good_Name VARCHAR(50),Good_UnitPrice INTEGER(10),数量INTEGER););
            db.setVersion(ToDoItems_VERSION);


        }

        公共无效的openDatabase()抛出的SQLException {
            字符串mypath中= DATABASE_PATH + DATABASE_NAME;

            dbSqlite = SQLiteDatabase.openDatabase(mypath中,空,
                    SQLiteDatabase.OPEN_READWRITE);
        }

        @覆盖
        市民同步无效的close(){
            如果(dbSqlite!= NULL)
                dbSqlite.close();

            super.close();
        }

        公共光标getCursor(){
            SQLiteQueryBuilder QueryBuilder的=新SQLiteQueryBuilder();

            queryBuilder.setTables(TABLE_NAME);

            的String [] asColumnsToReturn =新的String [] {COLUMN_TITLE,COLUMN_NAME_DESC};

            光标mCursor = queryBuilder.query(dbSqlite,asColumnsToReturn,空,
                    NULL,NULL,NULL,NULL);

            返回mCursor;
        }

       //公共无效clearSelections(){
         // ContentValues​​值=新ContentValues​​();
          // values​​.put(COLUMN_SELECTED,0);
          // this.dbSqlite.update(SqlHelper.TABLE_NAME,价值观,NULL,NULL);
       //}
    }
 

我的logcat:

  12-19 14:36:02.999:E / AndroidRuntime(436):致命异常:主要
12-19 14:36:02.999:E / AndroidRuntime(436):java.lang.IllegalArgumentException:如果列'_id'不存在
12-19 14:36:02.999:E / AndroidRuntime(436):在android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:297)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.widget.CursorAdapter.init(CursorAdapter.java:169)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.widget.CursorAdapter< INIT>(CursorAdapter.java:117)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.widget.ResourceCursorAdapter< INIT>(ResourceCursorAdapter.java:52)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.widget.SimpleCursorAdapter< INIT>(SimpleCursorAdapter.java:78)
12-19 14:36:02.999:E / AndroidRuntime(436):在com.example.nfc.CustomSqlCursorAdapter< INIT>(CustomSqlCursorAdapter.java:28)
12-19 14:36:02.999:E / AndroidRuntime(436):在com.example.nfc.current_cart $ SelectDataTask.onPostExecute(current_cart.java:110)
12-19 14:36:02.999:E / AndroidRuntime(436):在com.example.nfc.current_cart $ SelectDataTask.onPostExecute(current_cart.java:1)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.os.AsyncTask.finish(AsyncTask.java:590)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.os.AsyncTask.access $ 600(AsyncTask.java:149)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:603)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.os.Handler.dispatchMessage(Handler.java:99)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.os.Looper.loop(Looper.java:126)
12-19 14:36:02.999:E / AndroidRuntime(436):在android.app.ActivityThread.main(ActivityThread.java:3997)
12-19 14:36:02.999:E / AndroidRuntime(436):在java.lang.reflect.Method.invokeNative(本机方法)
12-19 14:36:02.999:E / AndroidRuntime(436):在java.lang.reflect.Method.invoke(Method.java:491)
12-19 14:36:02.999:E / AndroidRuntime(436):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:841)
12-19 14:36:02.999:E / AndroidRuntime(436):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
12-19 14:36:02.999:E / AndroidRuntime(436):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

一个光标适配器,需要你给它包含一个 _id 列,如文档中规定的游标

  

光标必须包含一个名为_id列或这个类将无法工作。

您需要这样的列添加到您的表。这是 ID 用于在提到一个ID的所有方法(onItemSelected,getItemId,...)

I write a program that can show data that stored in database in listview by cursor.but in runtime it gives me force close.I read logcat but i don t understand what is this error.I give my code and logcat.please help me

current_cart code:

public class current_cart extends ListActivity {

    private ListView mainListView = null;
    CustomSqlCursorAdapter adapter = null;
    private SqlHelper dbHelper = null;
    private Cursor currentCursor = null;

    private ListView listView = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.current_cart);

        if (this.dbHelper == null) {
            this.dbHelper = new SqlHelper(this);

        }

        listView = getListView();
        listView.setItemsCanFocus(false);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        //listView.setClickable(true);

        Button btnClear = (Button) findViewById(R.id.btnClear);
        btnClear.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),
                        " You clicked Clear button", Toast.LENGTH_SHORT).show();
              //  ClearDBSelections();
            }
        });

        new SelectDataTask().execute();

        this.mainListView = getListView();

        mainListView.setCacheColorHint(0);

    }

    @Override
    protected void onRestart() {
        super.onRestart();
        new SelectDataTask().execute();
    }

    @Override
    protected void onPause() {

        super.onPause();
        this.dbHelper.close();
    }

  //  protected void ClearDBSelections() {

      //  this.adapter.ClearSelections();

  //  }

    private class SelectDataTask extends AsyncTask<Void, Void, String> {

        protected String doInBackground(Void... params) {

            try {

                current_cart.this.dbHelper.createDatabase(dbHelper.dbSqlite);
                current_cart.this.dbHelper.openDataBase();

                current_cart.this.currentCursor = current_cart.this.dbHelper
                        .getCursor();

            } 
            catch (SQLException sqle) 
            {

                throw sqle;

            }
            return null;
        }

        // can use UI thread here
        protected void onPostExecute(final String result) {

            startManagingCursor(current_cart.this.currentCursor);
            int[] listFields = new int[] { R.id.txtTitle,R.id.txtprice };
            String[] dbColumns = new String[] { SqlHelper.COLUMN_TITLE,SqlHelper.COLUMN_NAME_DESC };

            current_cart.this.adapter = new CustomSqlCursorAdapter(
                    current_cart.this, R.layout.single_item,
                    current_cart.this.currentCursor, dbColumns, listFields,
                    current_cart.this.dbHelper);
            setListAdapter(current_cart.this.adapter);

        }
    }

}

CustomSqlCursorAdapter code:

public class CustomSqlCursorAdapter extends SimpleCursorAdapter {
    private Context mContext;

    private SqlHelper mDbHelper;
    private Cursor mCurrentCursor;

    public CustomSqlCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to, SqlHelper dbHelper) {
        super(context, layout, c, from, to);
        this.mCurrentCursor = c;
        this.mContext = context;
        this.mDbHelper = dbHelper;

    }

    public View getView(int pos, View inView, ViewGroup parent) {
        View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.single_item, null);
        }

        if (!this.mCurrentCursor.moveToPosition(pos)) {
            throw new SQLException("CustomSqlCursorAdapter.getView: Unable to move to position: "+pos);
        }

        CheckBox cBox = (CheckBox) v.findViewById(R.id.bcheck);


        cBox.setTag(Integer.valueOf(this.mCurrentCursor.getInt(0)));


        cBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


            }
        });

        TextView txtTitle = (TextView) v.findViewById(R.id.txtTitle);
        txtTitle.setText(this.mCurrentCursor.getString(this.mCurrentCursor
                .getColumnIndex(SqlHelper.COLUMN_TITLE)));
        TextView txtprice = (TextView) v.findViewById(R.id.txtprice);
        txtprice.setText(this.mCurrentCursor.getString(this.mCurrentCursor
                .getColumnIndex(SqlHelper.COLUMN_NAME_DESC)));

        return (v);
    }


}

SqlHelper code:

    public class SqlHelper extends SQLiteOpenHelper {
        private static final String DATABASE_PATH = "/data/data/com.example.bb/databases/";

        public static final String DATABASE_NAME = "ll";

        public static final String TABLE_NAME = "w";
        public static final int ToDoItems_VERSION = 1;

       // public static final String COLUMN_ID = "_id";             
        public static final String COLUMN_TITLE = "Good_Name";         
       public static final String COLUMN_NAME_DESC = "Good_UnitPrice";


        public SQLiteDatabase dbSqlite;
        private Context mContext;

        public SqlHelper(Context context) {
            super(context, DATABASE_NAME, null, 1);
            mContext = context;
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            createDB(db);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w("SqlHelper", "Upgrading database from version " + oldVersion
                    + " to " + newVersion + ", which will destroy all old data");

            db.execSQL("DROP TABLE IF EXISTS w;");

            createDB(db);
        }

        public void createDatabase(SQLiteDatabase db) {
            createDB(db);
        }

        private void createDB(SQLiteDatabase db) {
            if (db == null) {
                db = mContext.openOrCreateDatabase(DATABASE_NAME, 0, null);
            }

            db.execSQL("CREATE TABLE IF NOT EXISTS w (Cart_ID INTEGER, Good_Name VARCHAR(50),Good_UnitPrice INTEGER (10),Quantity INTEGER);");
            db.setVersion(ToDoItems_VERSION);


        }

        public void openDataBase() throws SQLException {
            String myPath = DATABASE_PATH + DATABASE_NAME;

            dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);
        }

        @Override
        public synchronized void close() {
            if (dbSqlite != null)
                dbSqlite.close();

            super.close();
        }

        public Cursor getCursor() {
            SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

            queryBuilder.setTables(TABLE_NAME);

            String[] asColumnsToReturn = new String[] {COLUMN_TITLE,COLUMN_NAME_DESC};

            Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null,
                    null, null, null, null);

            return mCursor;
        }

       // public void clearSelections() {
         //   ContentValues values = new ContentValues();
          //  values.put(COLUMN_SELECTED, 0);
          //  this.dbSqlite.update(SqlHelper.TABLE_NAME, values, null, null);
       // }
    }

my logcat:

12-19 14:36:02.999: E/AndroidRuntime(436): FATAL EXCEPTION: main
12-19 14:36:02.999: E/AndroidRuntime(436): java.lang.IllegalArgumentException: column '_id' does not exist
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:297)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.widget.CursorAdapter.init(CursorAdapter.java:169)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.widget.CursorAdapter.<init>(CursorAdapter.java:117)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
12-19 14:36:02.999: E/AndroidRuntime(436):  at com.example.nfc.CustomSqlCursorAdapter.<init>(CustomSqlCursorAdapter.java:28)
12-19 14:36:02.999: E/AndroidRuntime(436):  at com.example.nfc.current_cart$SelectDataTask.onPostExecute(current_cart.java:110)
12-19 14:36:02.999: E/AndroidRuntime(436):  at com.example.nfc.current_cart$SelectDataTask.onPostExecute(current_cart.java:1)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.os.AsyncTask.finish(AsyncTask.java:590)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.os.AsyncTask.access$600(AsyncTask.java:149)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:603)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.os.Looper.loop(Looper.java:126)
12-19 14:36:02.999: E/AndroidRuntime(436):  at android.app.ActivityThread.main(ActivityThread.java:3997)
12-19 14:36:02.999: E/AndroidRuntime(436):  at java.lang.reflect.Method.invokeNative(Native Method)
12-19 14:36:02.999: E/AndroidRuntime(436):  at java.lang.reflect.Method.invoke(Method.java:491)
12-19 14:36:02.999: E/AndroidRuntime(436):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
12-19 14:36:02.999: E/AndroidRuntime(436):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
12-19 14:36:02.999: E/AndroidRuntime(436):  at dalvik.system.NativeStart.main(Native Method)

解决方案

A cursor adapter requires that the cursor you give it contains an _id column, as stated in the documentation :

The Cursor must include a column named "_id" or this class will not work.

You need to add such a column to your table. It is the id that is used in all methods that mention an id (onItemSelected, getItemId, ...)

这篇关于由光标列表视图中显示的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆