2014-05-19 60 views
2

我是新來的android sqlite。如何使用_id作爲複合主鍵創建表?

問題:

創建具有三列(列1即,列2和欄3)所有的類型TEXT .Column1和列2的表應該一起形成一個複合主key.Also,該表將被使用的CursorAdapter的。因此創建一個_id字段變得有必要。

至今:

  • 能夠作爲PK使用下面的查詢,而不_id創建一個表列1和列2:

    CREATE TABLE Test (column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(column1,column2));

  • 能夠創建一個表_id as AUTOINCREMENT

    CREATE TABLE Test ( _id INTEGER PRIMARY KEY AUTOINCREMENT, column1 TEXT, column2 TEXT, column3 TEXT);

但我無法創建兩者的組合。

我曾嘗試下面的查詢,並都給出錯誤:

1>CREATE TABLE Test ( _id INTEGER AUTOINCREMENT, column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(_id ,column1,column2));

2>CREATE TABLE Test ( _id INTEGER , column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(_id AUTOINCREMENT,column1,column2));

所以,請幫我在創建具有以下提到的功能表,即

  • 應該有一個_id自動增量字段
  • 應該對COLUMN1複合主鍵以及列2

回答

3

所以創建_id AUTOINCREMENT字段是強制性的。

不完全是。 Cursor需要一個唯一的_id INTEGER列。如果有的話,你可以使用INTEGER PRIMARY KEY。如果沒有,用ROWID

SELECT ROWID AS _id, ... 

其中...是您的查詢的其餘部分。這使您可以獨立保留表格模式,但仍然滿足CursorAdapter要求。

(以及如何我希望谷歌曾在2008年指出了這一點回來......)

+0

Thnx..got你指向 – Abhinav

+0

什麼是BIGINT和VARCHAR? _id可以是除INT之外的其他類型嗎? – Turowicz

+0

@Towowicz:我不知道SQLite支持這些數據類型。除此之外,'CursorAdapter'將試圖獲得一個'long',我不知道除了'INTEGER'之外什麼類型可以工作,因爲我還沒有嘗試過。 – CommonsWare

-1

試試這個,

CREATE TABLE IF NOT EXISTS Test (_id INTEGER, column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(_id,column1,column2)); 
0

如果使用ROWID方法你打開自己,如果比賽條件多個解析器一次調用你的提供者?例如,讓我們說一些應用刪除第5行,將所有ROWID向下移動1 ..如果您在刷新數據集之前單擊以更新同一行,則最終會在第6行寫入,因爲您使用的是行號而不是唯一的ID(由於SQLiteDatabase是線程安全,因此ID會阻止此操作)。使用唯一的ID是重要的,即使它需要一個額外的列..想知道肯定..