2012-04-27 1 views
0

Я хочу, чтобы заполнить мой ListView данными из моей базы данных, но когда я пытаюсь сделать это только дает мне одно исключение т.е.В противном случае для заполнения 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); 
    } 
} 

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

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» в таблице, что я имею доступ. Пожалуйста, помогите. Спасибо!

ответ

2

Вы получаете доступ к таблице TABLE_ORDER_DETAILS, которая имеет столбец ORDER_DETAIL_ID, но это "order_detail_id", а не "_id". Он должен работать, если вы измените это, так как SimpleCursorAdapter ожидает столбец с именем точно _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); 
+0

Я помню, что особенно подробно, как это требует _id, но, глядя на документацию для SimpleCursorAdapter, он нигде не говорит, что его требуется ... но. – JoxTraex

+0

Хм, правда, нет документации в SimpleCursorAdapter об этом. Однако в [CursorAdapter] (http://developer.android.com/reference/android/widget/CursorAdapter.html) (и это суперкласс) – zapl

+0

хорошая находка, спасибо за разъяснение! – JoxTraex