Sự hiểu biết của tôi là nó sẽ trả về -1 nếu tất cả mã có thể được thực hiện đúng và lỗi "EXPECTED" đã xảy ra. Tuy nhiên, không phải tất cả các lỗi/trường hợp ngoại lệ được xử lý và một số trường hợp ngoại lệ vẫn có thể được kích hoạt:
- SQLiteDatabaseCorruptException
- IllegalArgumentException
- RuntimeException
- Cơ sở dữ liệu được mở ra cho read-only
- Đang cố gắng để chèn một nhân đôi khóa
HERE bạn có thể tìm thấy việc triển khai insert()
và insertOrThrow()
.
Bạn có thể thấy cả hai phương pháp đều giống nhau. Tuy nhiên, insert()
xử lý SQLException
giây cho bạn. insertOrThrow()
không xử lý bất kỳ ngoại lệ nào và bạn nên tự làm điều đó.
public long insert(String table, String nullColumnHack, ContentValues values) {
try {
return insertWithOnConflict(table, nullColumnHack, values, CONFLICT_NONE);
} catch (SQLException e) {
Log.e(TAG, "Error inserting " + values, e);
return -1;
}
}
public long insertOrThrow(String table, String nullColumnHack, ContentValues values)
throws SQLException {
return insertWithOnConflict(table, nullColumnHack, values, CONFLICT_NONE);
}
Cả hai phương pháp gọi insertWithOnConflict()
mà thực hiện là HERE:
public long insertWithOnConflict(String table, String nullColumnHack,
ContentValues initialValues, int conflictAlgorithm) {
acquireReference();
try {
// CODE
try {
// ONLY HERE I return some value.... Otherwise, I'll raise an exception
return statement.executeInsert();
} finally {
statement.close();
}
} finally {
releaseReference();
}
}
Trong việc thực hiện, bạn sẽ thấy rằng nó sẽ trả về "-1" chỉ khi statement.executeInsert();
lợi nhuận một cái gì đó (và có vẻ như rằng "-1 "đến từ đây):
.../khung/cơ sở/lõi/JNI/android_database_SQLiteConnection.cpp
static jlong nativeExecuteForLastInsertedRowId(JNIEnv* env, jclass clazz,
jlong connectionPtr, jlong statementPtr) {
SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr);
sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr);
int err = executeNonQuery(env, connection, statement);
return err == SQLITE_DONE && sqlite3_changes(connection->db) > 0
? sqlite3_last_insert_rowid(connection->db) : -1;
}
Nếu có bất kỳ lỗi/ngoại lệ nào khác xảy ra ở giữa, nó sẽ ném một ngoại lệ.
Nếu bạn làm theo các phương pháp được gọi, bạn có thể thấy rằng các lỗi khác không được xử lý. Ngoài ra, bạn sẽ nhận thấy rằng SQLite sẽ thực tế được thực hiện bởi một nhiệm vụ C (chứ không phải java). Vì vậy, một số lỗi không mong đợi vẫn có thể xảy ra.
Khi xảy ra lỗi, chẳng hạn như lỗi IO, tập dữ liệu sai, đóng dấu con trỏ, đặc quyền không writte writte cố gắng, vv Chủ yếu là nếu có lỗi xảy ra, -1 (không có hàng bị ảnh hưởng) thông tin được cung cấp – Bonatti