2015-10-04 53 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的例子中是由数据库引擎分配的。对于大多数用例来说,这已经足够好了。