Невозможно заполнить ListView через адаптер Simplecursor

Я хочу заполнить свой список данными из моей базы данных, но когда я пытаюсь это сделать, это просто дает мне одно исключение, т.е.

 "04-27 13:15:51.139: E/AndroidRuntime(2575): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist"

Независимо от того, какой адаптер я использую или но я получаю одно и то же исключение.

Это мой SQLiteOpenHelper:

public class MySQLiteHelper extends SQLiteOpenHelper {

    //      Table Names
    public static final String TABLE_USER_MASTER = "USER_MASTER";
    public static final String TABLE_ORDER_MASTER = "ORDER_MASTER";
    public static final String TABLE_ORDER_DETAILS = "ORDER_DETAILS";

    //      Database Details
    public static String DB_NAME = "ezeefood.db";
    public static String DB_PATH = "/data/data/com.project.menuApp";
    public static final int DATABASE_VERSION = 4;

    //      User Detail Columns
    public static final String KEY_ID = "_id";
    public static final String KEY_NAME = "Name";
    public static final String KEY_ADDRESS = "Address";
    public static final String KEY_PHONE = "PhoneNo";
    public static final String KEY_USERNAME = "userid";
    public static final String KEY_PASSWORD = "password";

    //      Order Master Columns
    public static final String ORDER_ID = "order_id";
    public static final String ORDER_DATE = "date";
    public static final String ORDER_TIME = "time";

    //      Order Detail Columns
    public static final String ORDER_DETAIL_ID = "order_detail_id";
    public static final String ORDER_ITEM_NAME = "item_name";
    public static final String ORDER_ITEM_RATE = "item_rate";
    public static final String ORDER_ITEM_QTY = "item_qty";
    public static final String ORDER_ID_FINAL = "order_Id";

     private SQLiteDatabase sqLiteDatabase;

    private static final String SCRIPT_CREATE_TABLE_USER_MASTER = "CREATE  TABLE "
            + TABLE_USER_MASTER + "(" + KEY_ID
            + "  INTEGER PRIMARY KEY  AUTOINCREMENT," + KEY_USERNAME + " VARCHAR UNIQUE, "
            + KEY_PASSWORD + " VARCHAR," + KEY_NAME + " VARCHAR,"
            + KEY_ADDRESS + " VARCHAR," + KEY_PHONE + " VARCHAR);";

    private static final String SCRIPT_CREATE_TABLE_ORDER_MASTER = "CREATE  TABLE "
            + TABLE_ORDER_MASTER + "(" + ORDER_ID
            + "  INTEGER PRIMARY KEY  AUTOINCREMENT," + KEY_USERNAME + " VARCHAR, "
            + ORDER_DATE + " VARCHAR," + ORDER_TIME +" VARCHAR);";

    private static final String SCRIPT_CREATE_TABLE_ORDER_DETAILS = "CREATE  TABLE "
            + TABLE_ORDER_DETAILS + "(" + ORDER_DETAIL_ID
            + "  INTEGER PRIMARY KEY  AUTOINCREMENT," + ORDER_ID_FINAL + " INTEGER, "
            + ORDER_ITEM_NAME + " VARCHAR," + ORDER_ITEM_RATE + " FLOAT,"
            + ORDER_ITEM_QTY + " INTEGER DEFAULT 1);";

    public MySQLiteHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(SCRIPT_CREATE_TABLE_USER_MASTER);
        database.execSQL(SCRIPT_CREATE_TABLE_ORDER_MASTER);
        database.execSQL(SCRIPT_CREATE_TABLE_ORDER_DETAILS);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.w(MySQLiteHelper.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER_MASTER);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_ORDER_MASTER);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_ORDER_DETAILS);
        onCreate(db);
    }
}

И здесь я пытаюсь заполнить свой список с помощью простого адаптера курсора.

public class FinalOrder extends ListActivity {

    Cursor cursor;
    long orderId;
    private SQLiteDatabase mDatabase;
    private MySQLiteHelper mDbhelper;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.orderdetails);
        Bundle c = getIntent().getExtras();
        orderId = c.getLong("orderID");
        mDbhelper = new MySQLiteHelper(this);
        mDatabase = mDbhelper.getReadableDatabase();    
        cursor = mDatabase.query(MySQLiteHelper.TABLE_ORDER_DETAILS, new String [] {MySQLiteHelper.ORDER_ITEM_NAME,
                MySQLiteHelper.ORDER_ITEM_QTY,MySQLiteHelper.ORDER_ITEM_RATE}, "order_Id = ?",
                new String[]{String.valueOf(orderId)}, null, null, null);
        startManagingCursor(cursor);

        String[] from = new String[] {MySQLiteHelper.ORDER_ITEM_NAME,MySQLiteHelper.ORDER_ITEM_QTY,MySQLiteHelper.ORDER_ITEM_RATE};
        int[] to = new int[] {R.id.tv_listItemName,R.id.tv_listItemQTY,R.id.tv_listItemPrice};

        ListAdapter adapter = new SimpleCursorAdapter(this,R.layout.orderlist_row,cursor,from,to);

        setListAdapter(adapter);
    }
}

Я понятия не имею, почему это дает такое исключение, у меня нет столбца с именем «_id» в таблице, к которой я обращаюсь. Пожалуйста, помогите. Благодарю вас!


person user1177583    schedule 27.04.2012    source источник


Ответы (1)


Вы обращаетесь к таблице TABLE_ORDER_DETAILS, в которой есть столбец ORDER_DETAIL_ID, но это "order_detail_id", а не "_id". Это должно работать, если вы измените это, поскольку SimpleCursorAdapter ожидает столбец с именем точно _id в курсоре.

Вы также должны включить столбец id в свой запрос. Быстрое исправление без переименования столбца в таблице — переименовать его в запросе:

    cursor = mDatabase.query(MySQLiteHelper.TABLE_ORDER_DETAILS,
            new String [] { MySQLiteHelper.ORDER_DETAIL_ID + " AS _id",
            MySQLiteHelper.ORDER_ITEM_NAME,
            MySQLiteHelper.ORDER_ITEM_QTY,
            MySQLiteHelper.ORDER_ITEM_RATE }, "order_Id = ?",
            new String[]{String.valueOf(orderId)}, null, null, null);
person zapl    schedule 27.04.2012
comment
Я помню эту конкретную деталь, поскольку для нее требуется _id, но, глядя на документацию для SimpleCursorAdapter, нигде не говорится, что это требуется... но это так. - person JoxTraex; 27.04.2012
comment
Хм, правда, в SimpleCursorAdapter нет документации по этому поводу. Однако он находится в CursorAdapter (и это суперкласс) - person zapl; 27.04.2012