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.

0
Boardy 27 wrzesień 2012, 22:12

2 odpowiedzi

Najlepsza odpowiedź

Być może został rzucony jakiś wyjątek inny niż SQLException i SQLiteException? Jeśli umieścisz catch(Exception x) {...}, prawdopodobnie zobaczysz.

2
Alexander Kulyakhtin 27 wrzesień 2012, 22:15

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

0
Dave 27 wrzesień 2012, 22:26