如何在不指定主键值的情况下将行插入SQLite表中

时间:2015-10-04 05:19:09

标签: android sql database sqlite

我正在开发一个项目,并且不理解我在网上找到的这部分代码。 (我也看过其他例子,他们做了完全相同的事情,但我不太明白为什么)

当他们在表中插入内容时,它们没有主键的值。有人可以向我解释为什么会这样吗?

以下是我发现的2个代码示例。 谢谢。

//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(); 
      }

2 个答案:

答案 0 :(得分:1)

因为主键是Autoincrement,因为它是ROWID的别名。

来自文档:

  

在SQLite中,表行通常具有64位有符号整数ROWID   这在同一个表中的所有行中都是唯一的。(WITHOUT ROWID   表是例外。)

     

您可以使用特殊的一个访问SQLite表的ROWID   列名称ROWID, ROWID 或OID。除非你宣布一个普通的   table列使用其中一个特殊名称,然后使用它   name将引用声明的列而不是内部ROWID。

     

如果表包含INTEGER PRIMARY KEY类型的列,那么   column成为ROWID的别名。然后,您可以访问ROWID   使用四个不同名称中的任何一个,描述原来的三个名字   以上或INTEGER PRIMARY KEY列的名称。所有这些   名称是彼此的别名,并且在任何名称中都同样有效   上下文。

     

当一个新行插入到SQLite表中时,ROWID也可以   被指定为INSERT语句的一部分,或者可以分配它   由数据库引擎自动生成。要手动指定ROWID,   只需将其包含在要插入的值列表中即可。例如:

所以在给出id的示例中,数据库引擎正在分配id。对于大多数用例而言,这已经足够了。

答案 1 :(得分:0)

您可以像

一样创建表格
static final String DATABASE_CREATE = "create table "+TABLE_NAME+"( ID integer primary key autoincrement,user_name  text,user_phone  text,user_email text); ";

然后它会自动增加

请参阅此链接http://www.freakyjolly.com/android-sqlite-integration/ http://www.freakyjolly.com/android-sqlite-how-to-insert-rows-in-database/