简体   繁体   English

Android:无法从原始查询填充ListView

[英]Android: Unable to populate ListView from raw query

I am trying to update a listview from a raw query statement, however I am getting a few errors. 我正在尝试从原始查询语句更新列表视图,但是我遇到了一些错误。

I have my method in my databaseAdapter class: 我在我的databaseAdapter类中有我的方法:

public Cursor getOpenLockers() {
        Cursor c = ourDatabase.rawQuery("SELECT number, status FROM "
                + DATABASE_TABLE + " WHERE status = 'open'", null);
        if (c != null) {
            c.moveToFirst();
        }

        return c;
    }

And then I have my listview method: 然后我有我的listview方法:

private void loadListOpenLockers() {
        // TODO Auto-generated method stub
        Locker getList = new Locker(this);
        getList.open();
        Cursor cursor = getList.getOpenLockers();
        startManagingCursor(cursor);
        // setup mapping
        String[] fromFieldNames = new String[] { getList.KEY_LOCKERNUMBER,
                getList.KEY_STATUS };

        int[] toViewIDs = new int[] { R.id.tvLockerNumber, R.id.tvSatus };

        // create adapter
        SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(this,
                R.layout.itemlayout, cursor, fromFieldNames, toViewIDs);

        // set the adapter
        ListView myList = (ListView) findViewById(R.id.lvInfo);
        myList.setAdapter(myCursorAdapter);
    }

I then call that method from an onClickListener and I get the following in my logcat: 然后,我从onClickListener调用该方法,并在logcat中得到以下内容:

> 04-03 21:35:07.695: E/AndroidRuntime(29384): FATAL EXCEPTION: main
> 04-03 21:35:07.695: E/AndroidRuntime(29384): Process:
> com.********, PID: 29384 04-03 21:35:07.695:
> E/AndroidRuntime(29384): java.lang.IllegalArgumentException: column
> '_id' does not exist 04-03 21:35:07.695: E/AndroidRuntime(29384):     at
> android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:309)
> 04-03 21:35:07.695: E/AndroidRuntime(29384):  at
> android.widget.CursorAdapter.init(CursorAdapter.java:172) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> android.widget.CursorAdapter.<init>(CursorAdapter.java:120) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
> 04-03 21:35:07.695: E/AndroidRuntime(29384):  at
> android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
> 04-03 21:35:07.695: E/AndroidRuntime(29384):  at
> com.samsunglockercenter.MainActivity.loadListOpenLockers(MainActivity.java:130)
> 04-03 21:35:07.695: E/AndroidRuntime(29384):  at
> com.samsunglockercenter.MainActivity.onClick(MainActivity.java:161)
> 04-03 21:35:07.695: E/AndroidRuntime(29384):  at
> android.view.View.performClick(View.java:4480) 04-03 21:35:07.695:
> E/AndroidRuntime(29384):  at
> android.view.View$PerformClick.run(View.java:18673) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> android.os.Handler.handleCallback(Handler.java:733) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> android.os.Handler.dispatchMessage(Handler.java:95) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> android.os.Looper.loop(Looper.java:157) 04-03 21:35:07.695:
> E/AndroidRuntime(29384):  at
> android.app.ActivityThread.main(ActivityThread.java:5872) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> java.lang.reflect.Method.invokeNative(Native Method) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> java.lang.reflect.Method.invoke(Method.java:515) 04-03 21:35:07.695:
> E/AndroidRuntime(29384):  at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1069)
> 04-03 21:35:07.695: E/AndroidRuntime(29384):  at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885) 04-03
> 21:35:07.695: E/AndroidRuntime(29384):    at
> dalvik.system.NativeStart.main(Native Method)

change the following to: 将以下内容更改为:

public Cursor getOpenLockers() {
    Cursor c = ourDatabase.rawQuery("SELECT number, status FROM "
            + DATABASE_TABLE + " WHERE status = 'open'", null);
    if (c != null) {
        c.moveToFirst();
    }

    return c;
}

to

public Cursor getOpenLockers() {
    Cursor c = ourDatabase.rawQuery("SELECT _id, number, status FROM "
            + DATABASE_TABLE + " WHERE status = 'open'", null);
    if (c != null) {
        c.moveToFirst();
    }

    return c;
}

Added _id in the select, also ensure that DATABASE_TABLE has the column _id. 在选择中添加了_id ,还确保DATABASE_TABLE具有列_id。

A cursor adapter will always need an _id column! 游标适配器将始终需要_id列!

Hope that helps.! 希望有帮助!

double check is there a column named '_id' in your table,and change the query to 仔细检查表中是否有名为“ _id”的列,并将查询更改为

ourDatabase.rawQuery("SELECT _id, number, status FROM "
            + DATABASE_TABLE + " WHERE status = 'open'", null);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM