0

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;
    }

content の値がスキップされており、finally に直接入っていることがわかりません。

4

2 に答える 2

2

SQLExceptionおそらく、と以外の例外SQLiteExceptionがスローされましたか? 入れれcatch(Exception x) {...}ば多分わかる。

于 2012-09-27T18:15:43.493 に答える
0

まずは線を移動してみます。

myDb = context.openOrCreateDatabase("PasswordManager", Context.MODE_PRIVATE, null);

線の下に

 int rowId = common.getNextID("password");

あなたの方法で。または、 getNextID 関数にパラメーターとして myDb を追加して、同じ DB 参照を使用し、その関数で DB を閉じないようにすることをお勧めします。

catch(Exception x)を例外に追加します。

最後に、getNextIDメソッド内にブレークポイントを配置し、どの行でブレークしているかを正確に調べます。

乾杯

于 2012-09-27T18:26:14.600 に答える