2012-07-06 143 views
0

我有一個活動的數據庫,我想打開另一個動作,也是在這個活動我想創建一個列表視圖:列表視圖值導致錯誤

我的代碼如下

messagedb=context.openOrCreateDatabase("message",0, null); 
        messagedb.execSQL(
          "CREATE TABLE IF NOT EXISTS tab(" + 
      " _id INTEGER PRIMARY KEY AUTOINCREMENT ," + 
      " nickname varchar,sender INT(13),body varchar)"); 


        messagedb.execSQL("INSERT INTO tab VALUES('"+nickname+"','"+sender+"','"+sb+"')"); 
        messagedb.close(); 
        mydb.close(); 

當我插入值它說你的數據庫有4列,但你有ente 3列值.............我怎麼能從表中自動添加_id ......

我的列表查看活動如下

public class ListView extends ListActivity { 

SQLiteDatabase messagedb; 

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



    messagedb=ListView.this.openOrCreateDatabase("message",0, null); 
    messagedb.execSQL(
      "CREATE TABLE IF NOT EXISTS tab(" + 
      " _id INTEGER PRIMARY KEY AUTOINCREMENT," + 
      " nickname varchar,sender INT(13),body varchar)"); 



    Cursor cur = messagedb.rawQuery("select _id, nickname, body from tab", null); 
    String[] from = new String[] { "nickname", "body" }; 
    int[] to = new int[] { R.id.sender_entry, R.id.body_entry}; 

    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.my_list_entry, cur, from, to); 

    this.setListAdapter(mAdapter); 

    cur.close(); 

    messagedb.close(); 


} 

protected void onListItemClick(android.widget.ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 

    String nickName = ((TextView) v.findViewById(R.id.sender_entry)).getText().toString(); 

    String body = ((TextView) v.findViewById(R.id.body_entry)).getText().toString(); 

    Intent intent = new Intent(ListView.this,MessageViewPage.class); 
    Bundle b = new Bundle(); 

    b.putString("nick", nickName); 
    b.putString("body", body); 

    intent.putExtras(b); 

    startActivity(intent); 

    finish(); 





} 

} 
+0

你的問題是什麼?你的錯誤是什麼?生命的意義是什麼?! – AedonEtLIRA 2012-07-06 14:55:44

+0

當我插入值它說你的數據庫有4列,但你已經輸入3列的值.......在代碼的第一行不listView ....我意識到,它說,ID是失蹤... NA ?但我不知道如何在我的表中自動添加ID ....建議我如何將ID添加到表中? – 2012-07-06 14:59:46

+0

我怎麼能在列中添加空值 – 2012-07-06 15:09:33

回答

0

此:

" _id INTEGER PRIMARY KEY ," 

,如果你想在DB自動照顧的主鍵對您來說應該是這樣的:

" _id INTEGER PRIMARY KEY AUTOINCREMENT," 

否則,你需要手動添加「_id」當你做一個插入。

使用autoincrement是迄今爲止更簡單的解決方案。

然後如果你想從記錄的所有數據,只要做到這一點:

Cursor cur = messagedb.rawQuery("select * from tab", null); 

如果您只需要特定位,只使用大多數Android部件時呼籲他們(但是要記住,你必須有即使你不顯示它,光標中的_id)。所以,如果你只是想的暱稱,您的查詢可能是這樣的:

Cursor cur = messagedb.rawQuery("select _id, nickname from tab", null); 

你也應該只有代碼在一個地方創建表。把它放在兩個地方是很糟糕的。看起來現在發生的事情是你改變了一個而不是另一個,而你沒有改變的那個先調用,創建沒有你改變的表,然後當第二個調用時,表alre4ady存在,所以它不會不做你的改變。至少您需要將兩個表創建語句更改爲相同。更好的解決辦法是擺脫其中的一個。

你也應該使用ContentValues做你的刀片......

ContentValues initialValues = new ContentValues(); 
initialValues.put("nickname", nickname); 
initialValues.put("sender", sender); 
initialValues.put("body", sb); 
messagedb.insertWithOnConflict(tab, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE); 

哦,如果你關閉遊標,而你的名單仍然活躍你就會有問題。獲取光標後立即清除cur.close()呼叫,而不是所有startManagingCursor(cur);。這樣系統會爲你管理光標。

+0

,但在我的第二個活動定義ID爲空...所以我如何更改'遊標cur = messagedb.rawQuery(「選擇rowid作爲_id,暱稱,身體從選項卡」, null);'這 – 2012-07-06 15:15:45

+0

我的ListView爲空 – 2012-07-06 15:22:01

+0

你改變它,因爲我在我的答案中顯示。 「rowid as _id」是它分開的地方,你沒有一個名爲「rowid」的列,所以它返回null。你應該使用'Cursor cur = messagedb.rawQuery(「select _id,nickname,body from tab」,null);'一旦你用'autoincrement'重新創建了你的數據庫。 – Barak 2012-07-06 15:22:06

0

嘗試設置你的ID爲自動增量:
ID整數主鍵自動增量
我也建議使用ContentValues使用方法sqlDB.insert(表,nullColumnHack,值)值插入數據庫。這更容易,更不容易出錯。