我有一个函数,它应该向SQLite数据库添加一条新记录。然后,该函数将调用一个函数将一个int返回给一个变量,然后跳过其余的代码并直接进入finally语句。
以下是方法。
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;
以下是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;
}
我不明白已经跳过了内容值,它直接进入了finally。
答案 0 :(得分:2)
也许除了SQLException
和SQLiteException
之外还有一些例外?如果你放catch(Exception x) {...}
,你可能会看到。
答案 1 :(得分:0)
首先尝试移动线。
myDb = context.openOrCreateDatabase("PasswordManager", Context.MODE_PRIVATE, null);
以下
int rowId = common.getNextID("password");
在你的方法中。或者更好的方法是将myDb作为参数添加到你的getNextID函数中,这样你就可以使用相同的数据库引用,然后不要关闭该函数中的数据库。
在catch(Exception x)
中添加您的例外情况。
然后最后在你的getNextID
方法中放入一个断点,并确切地找出它正在破坏的行。
干杯