2015-10-04 51 views
0

我正在開發一個項目並且不理解我在線發現的這段代碼的這部分內容。 (我也看過其他的例子,他們做了完全相同的事情,但我不太明白爲什麼)如何將行插入到SQLite表中而不指定主鍵的值

當他們在表中插入某些東西時,他們對主鍵沒有任何價值。有人可以向我解釋爲什麼是這樣嗎?

以下是我發現的兩個代碼示例,按照上面的說明進行操作。 謝謝。

//As you can see a contact has 3 attributes. 
int _id; 
String _name; 
String _phone_number; 


// Where they create a table. As you can see the primary key is ID 
@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
    + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT, + KEY_PH_NO + " TEXT" + ")"; 

    db.execSQL(CREATE_CONTACTS_TABLE); 
} 


    // Adding new contact 
    //*This is what I don't understand. Why don't they get an ID for the contact. 
    //They only have values for the name and phone number when they insert it into the table.* 
    public void addContact(Contact contact) 
    { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, contact.getName()); // Contact Name 
     values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone Number 

     // Inserting Row 
     db.insert(TABLE_CONTACTS, null, values); 
     db.close(); // Closing database connection 
    } 

繼承人另一個例子,但這是使用一本書。 一本書有3個屬性,一個id(主鍵),一個作者和書名。再次,他們沒有得到主鍵的價值。

public void addBook(Book book) 
    { 
     Log.d("addBook", book.toString()); 
     // 1. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 

     // 2. create ContentValues to add key "column"/value 
     ContentValues values = new ContentValues(); 
     values.put(KEY_TITLE, book.getTitle()); // get title 
     values.put(KEY_AUTHOR, book.getAuthor()); // get author 

     // 3. insert 
     db.insert(TABLE_BOOKS, // table 
      null, //nullColumnHack 
      values); // key/value -> keys = column names/ values = column values 

     // 4. close 
     db.close(); 
     } 

回答

1

因爲主鍵是Autoincrement,因爲它是ROWID的別名。

從文檔:

SQLite中,表中的行通常具有64位帶符號整數ROWID 這是在同一個表中的所有行中是唯一的。(不ROWID 表是例外)。

您可以訪問使用一個一個SQLite表的ROWID的特殊 列名ROWID,ROWID,或OID。除非您聲明一個普通的 表列使用這些特殊名稱之一,那麼使用該名稱將引用聲明列而不是內部ROWID。

如果一個表包含一個類型爲INTEGER PRIMARY KEY的列,那麼該列將成爲ROWID的別名。然後,您可以使用四個不同名稱中的任何一個來訪問ROWID ,原始三個名稱分別描述如上 或給予INTEGER PRIMARY KEY列的名稱。所有這些 名稱都是別名的別名,並且在任何 上下文中均可以很好地工作。

當一個新的行被插入到一個SQLite表中,ROWID可以 被指定爲INSERT語句的一部分,或者它可以由數據庫引擎自動分配 。要手動指定一個ROWID, 只是將其包含在要插入的值列表中。例如:

所以在你給id的例子中是由數據庫引擎分配的。對於大多數用例來說,這已經足夠好了。