Mein Verständnis ist, dass es -1 zurückgibt, wenn der gesamte Code ordnungsgemäß ausgeführt werden konnte und ein Fehler "EXPECTED" aufgetreten ist. Allerdings sind nicht alle Fehler/Ausnahmen behandelt und einige Ausnahmen noch ausgelöst werden können:
- SQLiteDatabaseCorruptException
- Illegal
- Runtime
- Datenbank für schreibgeschützte
- geöffnet versucht, eine duplizierte einfügen Schlüssel
HERE Sie können die Implementierung vonfindenund insertOrThrow()
.
Sie können sehen, dass beide Methoden ähnlich sind. Jedoch insert()
behandelt SQLException
s für Sie. insertOrThrow()
behandelt keine Ausnahme und Sie sollten es selbst tun.
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);
}
Beide Methoden nennt insertWithOnConflict()
die Umsetzung ist 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();
}
}
Bei der Umsetzung werden Sie sehen, dass es gibt „-1“ nur dann, wenn statement.executeInsert();
kehrt etwas (und es scheint, dass „-1 "kam von hier):
.../Frameworks/base/Kern/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;
}
Wenn ein anderer Fehler/Ausnahme in der Mitte auftritt, wird eine Ausnahme ausgelöst.
Wenn Sie den aufgerufenen Methoden folgen, können Sie sehen, dass andere Fehler nicht behandelt werden. Außerdem werden Sie feststellen, dass die SQLite tatsächlich von einer C-Task (und nicht von Java) ausgeführt wird. Daher können mehrere nicht erwartete Fehler weiterhin auftreten.
Wenn Fehler auftreten, z. B. IO-Fehler, falscher Datensatz, geschlossener Cursor writed, nicht geschriebene Rechte schreiben, usw. Meistens, wenn irgendein Fehler auftritt, -1 (die keine Zeile betroffen war) wird die Information – Bonatti