我正在开发一个项目,并且不理解我在网上找到的这部分代码。 (我也看过其他例子,他们做了完全相同的事情,但我不太明白为什么)
当他们在表中插入内容时,它们没有主键的值。有人可以向我解释为什么会这样吗?
以下是我发现的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();
}
答案 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/