package net.osmand.plus.api; import net.osmand.plus.OsmandApplication; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class SQLiteAPIImpl implements SQLiteAPI { private OsmandApplication app; public SQLiteAPIImpl(OsmandApplication app) { this.app = app; } @Override public SQLiteConnection getOrCreateDatabase(String name, boolean readOnly) { android.database.sqlite.SQLiteDatabase db = app.openOrCreateDatabase(name, readOnly ? SQLiteDatabase.OPEN_READONLY : (SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING), null); if(db == null) { return null; } return new SQLiteDatabaseWrapper(db) ; } public class SQLiteDatabaseWrapper implements SQLiteConnection { android.database.sqlite.SQLiteDatabase ds; public SQLiteDatabaseWrapper(android.database.sqlite.SQLiteDatabase ds) { super(); this.ds = ds; } @Override public int getVersion() { return ds.getVersion(); } @Override public void close() { ds.close(); } @Override public SQLiteCursor rawQuery(String sql, String[] selectionArgs) { final Cursor c = ds.rawQuery(sql, selectionArgs); if(c == null) { return null; } return new SQLiteCursor() { @Override public boolean moveToNext() { return c.moveToNext(); } @Override public String[] getColumnNames() { return c.getColumnNames(); } @Override public boolean moveToFirst() { return c.moveToFirst(); } @Override public String getString(int ind) { return c.getString(ind); } @Override public void close() { c.close(); } @Override public double getDouble(int ind) { return c.getDouble(ind); } @Override public long getLong(int ind) { return c.getLong(ind); } @Override public long getInt(int ind) { return c.getInt(ind); } @Override public byte[] getBlob(int ind) { return c.getBlob(ind); } }; } @Override public void execSQL(String query) { ds.execSQL(query); } @Override public void execSQL(String query, Object[] objects) { ds.execSQL(query, objects); } @Override public SQLiteStatement compileStatement(String query) { final android.database.sqlite.SQLiteStatement st = ds.compileStatement(query); if(st == null) { return null; } return new SQLiteStatement() { @Override public void execute() { st.execute(); } @Override public void close() { st.close(); } @Override public void bindString(int i, String value) { st.bindString(i, value); } @Override public void bindNull(int i) { st.bindNull(i); } @Override public long simpleQueryForLong() { return st.simpleQueryForLong(); } @Override public String simpleQueryForString() { return st.simpleQueryForString(); } @Override public void bindLong(int i, long val) { st.bindLong(i, val); } @Override public void bindBlob(int i, byte[] val) { st.bindBlob(i, val); } }; } @Override public void setVersion(int newVersion) { ds.setVersion(newVersion); } @Override public boolean isReadOnly() { return ds.isReadOnly(); } @Override public boolean isDbLockedByOtherThreads() { return ds.isDbLockedByOtherThreads(); } @Override public boolean isClosed() { return !ds.isOpen(); } } @Override public SQLiteConnection openByAbsolutePath(String path, boolean readOnly) { // fix http://stackoverflow.com/questions/26937152/workaround-for-nexus-9-sqlite-file-write-operations-on-external-dirs android.database.sqlite.SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, readOnly? SQLiteDatabase.OPEN_READONLY : (SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING)); if(db == null) { return null; } return new SQLiteDatabaseWrapper(db) ; } }