0

API16 では、新しい WAL (Write Ahead Logging) が Android の SQLiteDatabase クラスに導入されました。SQLite データベースで WAL が有効になっているかどうかをテストしたいと思います。アプリは古い Android リリースでも実行されるため、これらの新しい関数のラッパー クラスが SQLiteDatabase に必要です。機能は次のとおりです。

  • public boolean isWriteAheadLoggingEnabled()
  • public boolean enableWriteAheadLogging()
  • public void disableWriteAheadLogging ()

Android Developer Blogで、新しいクラスをラップするラッパー クラスに関する記事を見つけました。私が見つけられなかったのは、既存のクラスの新しいメソッドのラッパーです。どうすればいいですか?

4

1 に答える 1

1

のコンストラクターSQLiteDatabaseはプライベートであるため、それを拡張してクラス自体に「ラッパー」を追加することはできません。ただし、次のように「ヘルパー」ラッパーを書くこともできます。

public class WALWrapper {
    private boolean mAvailable;
    private Method mIsWriteAheadLoggingEnabled;
    private Method mEnableWriteAheadLogging;
    private Method mDisableWriteAheadLogging;
    private final SQLiteDatabase mDb;

    public WALWrapper(SQLiteDatabase db) {
        mDb = db;
        mAvailable = false;
        try {
            mIsWriteAheadLoggingEnabled =
                    SQLiteDatabase.class.getMethod("isWriteAheadLoggingEnabled");
            mEnableWriteAheadLogging =
                    SQLiteDatabase.class.getMethod("enableWriteAheadLogging");
            mDisableWriteAheadLogging =
                    SQLiteDatabase.class.getMethod("disableWriteAheadLogging");
            mAvailable = true;
        } catch (NoSuchMethodException e) {
        }
    }

    /**
     * Returns <code>true</code> if the {@link #isWriteAheadLoggingEnabled()},
     * {@link #enableWriteAheadLogging()} and {@link #disableWriteAheadLogging()}
     * are available.
     * @return <code>true</code> if the WALWrapper is functional, <code>false</code>
     *  otherwise.
     */
    public boolean isWALAvailable() {
        return mAvailable;
    }

    public boolean isWriteAheadLoggingEnabled() {
        boolean result = false;
        if (mIsWriteAheadLoggingEnabled != null) {
            try {
                result = (Boolean) mIsWriteAheadLoggingEnabled.invoke(mDb);
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
        }
        return result;
    }

    public boolean enableWriteAheadLogging() {
        boolean result = false;
        if (mEnableWriteAheadLogging != null) {
            try {
                result = (Boolean) mEnableWriteAheadLogging.invoke(mDb);
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
        }
        return result;
    }

    public void disableWriteAheadLogging() {
        if (mDisableWriteAheadLogging != null) {
            try {
                mDisableWriteAheadLogging.invoke(mDb);
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
        }
    }
}
于 2012-08-10T10:11:24.760 に答える