SQLiteDatabase insert 方法插入一行并将插入行的 rowid 作为 long 或在冲突的情况下返回 -1 以指示该行没有插入。因此,如果插入了行,newRowId 的值将是大于 0 的正值;如果没有插入并且没有其他冲突(例如,外键约束冲突将导致抛出异常),则为 -1。
-
conflicts 可能是 PRIMARY KEY、UNIQUE、CHECK 或 NULL 约束违规。
insert 方法是一种方便的方法,它生成底层 SQL 绑定任何参数并执行它。生成的 SQL 将类似于:-
INSERT OR IGNORE INTO the_table_name (the_name_column, the_breed_column, the_weight_column) VALUES(?,?,?);
地点:-
-
the_table_name 将是根据第一个参数的值,即 AppContract.HeadphoneEntry.TABLE_NAME 解析为的任何值。
-
the_name_column 将是 ContentValues 中第一个值的第一个值(即 AppContract.HeadphoneEntry.COLUMN_NAME 解析为的值)
-
the_breed_column 将根据第二个 ContentValues 的第一个值(即 AppContract.HeadphoneEntry.COLUMN_BREED 解析为的值)的第一个值进行赋值
-
the_weight_column 是第三个ContentValues 的第一个值(即AppContract.HeadphoneEntry.COLUMN_WEIGHT 解析为的值)
? 被相应 ContentValues 的第二个值替换(从第一个开始,即 'Toto',从第二个开始,即 'Terrier' ....) 绑定 SQL 语句时。绑定语句正确地将实际值括在单引号中,从而防止 SQL 注入。
执行sqlite3_last_insert_rowid()接口后,返回结果0转为-1。
如果您不使用便捷方法,那么要复制它所做的一切,您将不得不编写如下代码:-
db.execSQL("INSERT OR IGNORE INTO " + AppContract.HeadphoneEntry.TABLE_NAME +
"(" +
AppContract.HeadphoneEntry.COLUMN_NAME +
"," + AppContract.HeadphoneEntry.COLUMN_BREED +
"," + AppContract.HeadphoneEntry.COLUMN_WEIGHT +
") " +
"VALUES(?,?,?)",
new String[]
{
"Toto",
"Terrier",
"7"
}
);
Cursor csr = db.rawQuery("SELECT last_insert_rowid()",null);
newRowID = -1;
if (csr.moveToFirst()) {
newRowID = csr.getLong(0);
if (newRowID <= 0) {
newRowID = -1;
}
}
csr.close();
其中 db 是实例化的 SQLiteDatabase 对象。
如果您的目标是尝试预测下一个要使用的 rowid,那么您可以使用:-
Cursor csr = db.rawQuery("SELECT max(rowid)+1 FROM " + AppContract.HeadphoneEntry.TABLE_NAME + ";",null);
long newRowID = 1; //
if (csr.moveToFirst()) {
newRowID = csr.getLong(0);
}
但请注意 SQLite 不保证下一个插入的行将比现有的最高 rowid 大 1。如果您使用 AUTO INCREMENT ,则 sqlite_sequence 表存储该表使用的最高 rowid 和较高的值,并且将使用 max(rowid) 值。 即使如此,他们仍然不能保证预测值将是使用的值。最好不要尝试预测 rowid 的值,而是检索它,以便 Android Java 使用便捷方法。
- 一个例外情况是,如果您深入研究使用负 rowid 值,而 -1 可能并不表示没有插入。