Mam funkcję, która ma dodać nowy rekord do bazy danych SQLite. Ta funkcja następnie wywoła funkcję zwracającą int do zmiennej, następnie reszta kodu zostanie pominięta i przejdzie bezpośrednio do instrukcji finally.
Poniżej znajduje się metoda.
SQLiteDatabase myDb = null;
if (type.equals("Website"))
{
details = formatUrl(details);
}
try
{
myDb = context.openOrCreateDatabase("PasswordManager", Context.MODE_PRIVATE, null);
int rowId = common.getNextID("password");
//ALL OF THIS CODE IS SKIPPED
ContentValues cv = new ContentValues();
cv.put("id", rowId);
cv.put("category", category);
cv.put("company", Encryption.encrypt(company));
cv.put("loginAction", Encryption.encrypt(details));
cv.put("username", Encryption.encrypt(username));
cv.put("password", Encryption.encrypt(password));
cv.put("type", type);
cv.put("appName", "N/A");
myDb.insert("password", null, cv);
}
catch (SQLiteException ex)
{
common.showBasicAlertDialog("Something has gone wrong.\n\nWe will fix this as soon as we can", false);
Log.e("Database Errror", ex.toString());
return false;
}
catch (SQLException ex)
{
common.showBasicAlertDialog("Something has gone wrong.\n\nWe will fix this as soon as we can", false);
Log.e("SQL Error", ex.toString());
return false;
}
finally
{
//IT GOES STRAIGHT INTO THIS CODE AFTER THE GETNEXTID METHOD RETURNS
if (myDb.isOpen())
{
myDb.close();
return true;
}
}
return false;
Poniżej znajduje się kod funkcji getNextId()
public int getNextID(String table)
{
int nextID = 1;
Cursor cursor = null;
SQLiteDatabase myDB = null;
try
{
myDB = context.openOrCreateDatabase("PasswordManager", Context.MODE_PRIVATE, null);
cursor = myDB.rawQuery("SELECT id FROM "+table+" ORDER BY id DESC LIMIT 1", null);
if (cursor != null)
{
cursor.moveToFirst();
nextID = cursor.getInt(0) + 1;
}
}
catch (SQLiteException ex)
{
Log.d("GetNextID", ex.toString());
nextID = -1;
}
finally
{
if (myDB.isOpen())
{
myDB.close();
}
if (!cursor.isClosed())
{
cursor.close();
}
}
return nextID;
}
Nie rozumiem, że wartości treści zostały pominięte i przechodzi od razu do końca.
2 odpowiedzi
Być może został rzucony jakiś wyjątek inny niż SQLException
i SQLiteException
? Jeśli umieścisz catch(Exception x) {...}
, prawdopodobnie zobaczysz.
Najpierw spróbuj przesunąć linię.
myDb = context.openOrCreateDatabase("PasswordManager", Context.MODE_PRIVATE, null);
Poniżej linii
int rowId = common.getNextID("password");
W twojej metodzie. Lub nawet lepiej byłoby dodać myDb jako parametr do funkcji getNextID, aby używać tego samego odniesienia do bazy danych, a następnie nie zamykać bazy danych w tej funkcji.
Dodaj catch(Exception x)
do swoich wyjątków.
A potem w końcu umieść punkt przerwania w swojej metodzie getNextID
i dowiedz się, w której dokładnie linii on się kończy.
Twoje zdrowie
Podobne pytania
Nowe pytania
android
Android to mobilny system operacyjny Google, używany do programowania lub tworzenia urządzeń cyfrowych (smartfony, tablety, samochody, telewizory, Wear, Glass, IoT). W przypadku tematów związanych z Androidem użyj tagów specyficznych dla Androida, takich jak android-intent, android-activity, android-adapter itp. W przypadku pytań innych niż programowanie lub programowanie, ale związanych ze strukturą Androida, użyj tego linku: https: // android.stackexchange.com.