当前位置: 首页 > 面试题库 >

使用SimpleCursorAdapter时发生运行时错误(IllegalArgumentException)-列'_id'不存在

元鸿波
2023-03-14
问题内容

我尝试获取一些数据库值并将其显示在列表视图中。

这是我的代码

public class SearchCustomer extends Activity{

private DBCreater dbHelper;

private SimpleCursorAdapter dataAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_customer);

    dbHelper = new DBCreater(this);
    dbHelper.open();

    displayListView();
}

private void displayListView(){

    Cursor cursor = dbHelper.fetchallcustomerdata();
    String[] columns = new String[] {
        DBCreater.Key_customer_Name,
        DBCreater.Key_customer_Shop,
        DBCreater.Key_customer_Location,
        DBCreater.Key_customer_Phon,
        DBCreater.Key_customer_Email,
        DBCreater.Key_customer_Address
    };

    int[] to = new int[]{
            R.id.tv_I_name_demo,
            R.id.tv_I_shop_demo,
            R.id.tv_I_location_demo,
            R.id.tv_I_phone_demo,
            R.id.tv_I_email_demo,
            R.id.tv_I_address_demo
    };

    final ListView listView = (ListView)findViewById(R.id.lv_I_listofcustomer_searchCustomer);
     dataAdapter = new SimpleCursorAdapter(this, R.layout.demosearch, cursor, columns, to,0);
    listView.setAdapter(dataAdapter);
    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> lidstView, View view, int position,
                long id) {
            // TODO Auto-generated method stub
            Cursor cursor =(Cursor)listView.getItemAtPosition(position);
            //Toast.makeText(cursor.getColumnIndexOrThrow(""), text, duration)
            String name=cursor.getString(cursor.getColumnIndexOrThrow("customer_name"));
            Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show();
        }
    });

    EditText myFilter = (EditText)findViewById(R.id.et_I_filter_searchCustomer);
    myFilter.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
            dataAdapter.getFilter().filter(s.toString());

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });
    dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {

        @Override
        public Cursor runQuery(CharSequence constraint) {
            // TODO Auto-generated method stub
            return dbHelper.fetchcustomerbyname(constraint.toString());
        }
    });
}


}

我得到的RuntimeException IllegalArgumentException

这是错误:

03-11 20:11:24.650:E / AndroidRuntime(887):java.lang.RuntimeException:
无法启动活动
ComponentInfo {com.NIRR.redistributionsystem /
com.NIRR.redistributionsystem.SearchCustomer}:
java.lang.IllegalArgumentException:列’_id’不存在

这是我的数据库查询:

public Cursor fetchallcustomerdata() {
    /*Cursor mCursor=ourDatabase.query(DATABASE_TABLE_CUSTOMER,new String[]{
            Key_customer_Name,Key_customer_Shop,Key_customer_Location,Key_customer_Phon,
            Key_customer_Email,Key_customer_Address},null,null,null,null,null,null);*/
     String selectQuery = "select  customer_name,customer_shop,customer_location,customer_phon,customer_email,customer_address from Customer" ;

        SQLiteDatabase db = ourHelper.getReadableDatabase();
        Cursor mCursor = db.rawQuery(selectQuery, null);
    if(mCursor != null){
        mCursor.moveToFirst();
    }
    return mCursor;
}

我使用的sql查询在SQLite db浏览器上运行时会给我正确的查询。我不知道这是什么意思column '_id',因为“不退出”这一行来了

dataAdapter = new SimpleCursorAdapter(this, R.layout.demosearch, cursor, columns, to,0);

请帮我谢谢。


问题答案:

按照文档的CursorAdapter,它的SimpleCursorAdapter一个子类:

游标必须包含一个名为“ _id”的列,否则此类将无法工作。

如果您的表已经有一个名为“ _id”的列,则只需将该列包括在查询的投影中(所请求的列)。

String selectQuery = "select _id, customer_name, ... from Customer";

如果您的表中没有“ _id”列,则可以对所有SQLite表默认具有的“行”进行别名(除非明确创建了没有行的列)。

String selectQuery = "select rowid as _id, customer_name, ... from Customer";

即使您不使用原始SQL,也可以执行相同的操作。例如,在query()通话中:

mCursor = db.query("Customer", new String[] {"rowid as _id", "customer_name", ...}, ...);

如果等效于“ _id”,则当然可以为另一列添加别名。不过请注意,Cursor如果您要手动从中检索值,则必须将别名(即“ _id”)与一起使用。



 类似资料:
  • 我是拉威尔的新手,所以你可能不得不忍受我,但我似乎有个小问题。现在,首先,我创建了一个基本模板,并使用phpMyAdmin和Wamp成功地运行了它,它运行得很好。我还得到了一个老项目,我被要求看一看,但由于某种原因,我无法让它运行。 这就是我正在使用的过程: 1:打开cmd更改到正确的目录 2:安装编写器 3:将目录更改为项目目录 4:运行 错误: PHP警告:需要(C:\wamp64\www\p

  • 我是的新手,遇到以下错误。 运行以下代码时会出现此错误(可在GitHub中获得:https://github.com/ddraj/hbase-trunk-mttr/blob/master/hbase-examples/src/main/java/org/apache/hadoop/hbase/mapreduce/sampleuploader.java) 我正在使用CDH5.2.6 我可以像这样获得

  • 我得到了这个错误: 我在pom中添加了这些依赖项。xml。我已经检查了stackflow的类似实现,并进行了干净的安装。我的项目正在生成文件,但运行测试时出现错误。我正在试着穿越日食。 我使用PowerMockRunner运行java类,并使用annotation InjectMock注入测试类。然后使用MockStatic方法模拟静态类。此外,我还添加了PrepareForTest注释,并添加了

  • 我正在尝试启动一台流浪机器(使用ansible),当它执行“composer安装”任务时,它会抛出一个错误。我搜索了这个问题,并尝试了多种无效的解决方案(解释如下)。 我相信这与流浪用户没有权限写入app/cache和app/log有关,即使我更改了VM和local上的权限。我不知道该怎么解决。 错误: 失败:[默认](项=编写器安装)= Composer.json文件: > 我也能够'rm-rf

  • 我有一个fxml文件已经注册了控制器。Controller实现EventHandler和方法句柄(ActionEvente)。如果发生注册事件,处理程序方法中的代码将被处理,但不总是这样。但是打印了以下异常跟踪。我错过了什么吗?

  • 所以,我在ubuntu中使用minikube v1.19.0,在kubernetes中使用nginx ingress。我有两个节点文件:auth和client,分别制作了docker图像 我得到了4个kubernetes-cinfig文件,如下所示: auth-deply.yaml: auth-moongo-depl.yaml: 客户-depl.yaml: ingress-srv.yaml: sk