8000 Initial work to bring the Support API to the library · ETS-Android4/sqlcipher-android@671a956 · GitHub
[go: up one dir, main page]

Skip to content

Commit 671a956

Browse files
Initial work to bring the Support API to the library
1 parent bfef48d commit 671a956

File tree

11 files changed

+319
-6
lines changed

11 files changed

+319
-6
lines changed

sqlcipher/build.gradle

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,35 @@ android {
4040
useLibrary 'android.test.base' // for android.test.AndroidTestCase
4141
useLibrary 'android.test.runner' // for android.test.MoreAsserts
4242

43+
compileOptions {
44+
sourceCompatibility JavaVersion.VERSION_1_8
45+
targetCompatibility JavaVersion.VERSION_1_8
46+
}
47+
4348
}
4449

4550
dependencies {
4651
implementation fileTree(include: ['*.jar'], dir: 'libs')
47-
androidTestImplementation 'androidx.annotation:annotation:1.2.0'
52+
implementation 'androidx.sqlite:sqlite:2.1.0'
53+
54+
// androidTestImplementation 'androidx.room:room-common:2.3.0'
55+
// androidTestImplementation 'androidx.room:room-runtime:2.3.0'
56+
// annotationProcessor 'androidx.room:room-compiler:2.3.0'
57+
58+
def room_version = "2.3.0"
59+
androidTestImplementation "androidx.room:room-runtime:$room_version"
60+
annotationProcessor "androidx.room:room-compiler:$room_version"
61+
androidTestImplementation "androidx.room:room-testing:$room_version"
62+
63+
testImplementation "androidx.arch.core:core-testing:room_version"
64+
65+
// For Room tests:
66+
// androidTestImplementation "androidx.room:room-runtime:2.1.0"
67+
// androidTestImplementation "androidx.room:room-testing:2.1.0"
68+
// annotationProcessor "androidx.room:room-compiler:2.1.0"
69+
70+
//androidTestImplementation 'androidx.annotation:annotation:1.2.0'
71+
4872
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
4973
androidTestImplementation 'androidx.test:rules:1.4.0'
5074
androidTestImplementation 'androidx.test:core:1.4.0'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package net.zetetic.database.sqlcipher_cts.support;
2+
3+
import androidx.room.Database;
4+
import androidx.room.RoomDatabase;
5+
6+
@Database(entities = {User.class}, version = 1)
7+
public abstract class AppDatabase extends RoomDatabase {
8+
public abstract UserDao userDao();
9+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package net.zetetic.database.sqlcipher_cts.support;
2+
3+
import static org.hamcrest.CoreMatchers.not;
4+
import static org.hamcrest.Matchers.is;
5+
import static org.junit.Assert.assertThat;
6+
7+
import android.content.Context;
8+
9+
import androidx.room.Room;
10+
import androidx.test.core.app.ApplicationProvider;
11+
import androidx.test.ext.junit.runners.AndroidJUnit4;
12+
import androidx.test.platform.app.InstrumentationRegistry;
13+
14+
import net.zetetic.database.sqlcipher.SupportOpenHelperFactory;
15+
16+
import org.junit.After;
17+
import org.junit.Before;
18+
import org.junit.Test;
19+
import org.junit.runner.RunWith;
20+
21+
import java.nio.charset.StandardCharsets;
22+
23+
@RunWith(AndroidJUnit4.class)
24+
public class SupportAPIRoomTest {
25+
26+
private AppDatabase db;
27+
28+
@Before
29+
public void before(){
30+
Context context = InstrumentationRegistry.getInstrumentation().getContext();
31+
// Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
32+
// Context context = ApplicationProvider.getApplicationContext();
33+
System.loadLibrary("sqlcipher");
34+
SupportOpenHelperFactory factory = new SupportOpenHelperFactory("user".getBytes(StandardCharsets.UTF_8));
35+
db = Room.databaseBuilder(context, AppDatabase.class, "users.db")
36+
.openHelperFactory(factory).build();
37+
}
38+
39+
@Test
40+
public void shouldInsertData(){
41+
UserDao userDao = db.userDao();
42+
User user = new User("John", "Doe");
43+
userDao.insertAll(user);
44+
assertThat(user.uid, is(not(0)));
45+
}
46+
47+
@After
48+
public void after(){
49+
if(db != null){
50+
db.close();
51+
}
52+
}
53+
54+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package net.zetetic.database.sqlcipher_cts.support;
2+
3+
import androidx.room.ColumnInfo;
4+
import androidx.room.Entity;
5+
import androidx.room.PrimaryKey;
6+
7+
@Entity
8+
public class User {
9+
@PrimaryKey
10+
public int uid;
11+
@ColumnInfo(name = "first_name")
12+
public String firstName;
13+
@ColumnInfo(name = "last_name")
14+
public String lastName;
15+
16+
public User(String firstName, String lastName) {
17+
this.firstName = firstName;
18+
this.lastName = lastName;
19+
}
20+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package net.zetetic.database.sqlcipher_cts.support;
2+
3+
import androidx.room.Dao;
4+
import androidx.room.Delete;
5+
import androidx.room.Insert;
6+
import androidx.room.Query;
7+
8+
import java.util.List;
9+
10+
@Dao
11+
public interface UserDao {
12+
@Query("SELECT * FROM user")
13+
List<User> getAll();
14+
15+
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
16+
List<User> loadAllByIds(int[] userIds);
17+
18+
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
19+
"last_name LIKE :last LIMIT 1")
20+
User findByName(String first, String last);
21+
22+
@Insert
23+
void insertAll(User... users);
24+
25+
@Delete
26+
void delete(User user);
27+
}

sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SQLiteDatabase.java

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
import android.util.Pair;
3737
import android.util.Printer;
3838

39+
import androidx.sqlite.db.SupportSQLiteDatabase;
40+
import androidx.sqlite.db.SupportSQLiteQuery;
41+
3942
import net.zetetic.database.sqlcipher.CloseGuard;
4043

4144
import java.io.File;
@@ -71,7 +74,7 @@
7174
* to the current locale.
7275
* </p>
7376
*/
74-
public final class SQLiteDatabase extends SQLiteClosable {
77+
public final class SQLiteDatabase extends SQLiteClosable implements SupportSQLiteDatabase {
7578
private static final String TAG = "SQLiteDatabase";
7679

7780
private static final int EVENT_DB_CORRUPT = 75004;
@@ -448,6 +451,46 @@ public void beginTransactionNonExclusive() {
448451
beginTransaction(null /* transactionStatusCallback */, false);
449452
}
450453

454+
@Override
455+
public void beginTransactionWithListener(final android.database.sqlite.SQLiteTransactionListener transactionListener) {
456+
beginTransaction(new SQLiteTransactionListener() {
457+
@Override
458+
public void onBegin() {
459+
transactionListener.onBegin();
460+
}
461+
462+
@Override
463+
public void onCommit() {
464+
transactionListener.onCommit();
465+
}
466+
467+
@Override
468+
public void onRollback() {
469+
transactionListener.onRollback();
470+
}
471+
}, true);
472+
}
473+
474+
@Override
475+
public void beginTransactionWithListenerNonExclusive(final android.database.sqlite.SQLiteTransactionListener transactionListener) {
476+
beginTransactionWithListenerNonExclusive(new SQLiteTransactionListener() {
477+
@Override
478+
public void onBegin() {
479+
transactionListener.onBegin();
480+
}
481+
482+
@Override
483+
public void onCommit() {
484+
transactionListener.onCommit();
485+
}
486+
487+
@Override
488+
public void onRollback() {
489+
transactionListener.onRollback();
490+
}
491+
});
492+
}
493+
451494
/**
452495
* Begins a transaction in EXCLUSIVE mode.
453496
* <p>
@@ -1102,6 +1145,58 @@ public void setPageSize(long numBytes) {
11021145
execSQL("PRAGMA page_size = " + numBytes);
11031146
}
11041147

1148+
@Override
1149+
public Cursor query(String query) {
1150+
return rawQuery(query);
1151+
}
1152+
1153+
@Override
1154+
public Cursor query(String query, Object[] bindArgs) {
1155+
return rawQuery(query, bindArgs);
1156+
}
1157+
1158+
@Override
1159+
public Cursor query(SupportSQLiteQuery query) {
1160+
return query(query, null);
1161+
}
1162+
1163+
@Override
1164+
public Cursor query(SupportSQLiteQuery query, CancellationSignal cancellationSignal) {
1165+
acquireReference();
1166+
try {
1167+
String sql = query.getSql();
1168+
SQLiteDirectCursorDriver driver = new SQLiteDirectCursorDriver(this, sql, "", cancellationSignal);
1169+
SQLiteQuery sqliteQuery = new SQLiteQuery(this, sql, cancellationSignal);
1170+
query.bindTo(sqliteQuery);
1171+
return new SQLiteCursor(driver, "", sqliteQuery);
1172+
} finally {
1173+
releaseReference();
1174+
}
1175+
}
1176+
1177+
@Override
1178+
public long insert(String table, int conflictAlgorithm, ContentValues values) throws android.database.SQLException {
1179+
return insertWithOnConflict(table, null, values, conflictAlgorithm);
1180+
}
1181+
1182+
@Override
1183+
public int delete(String table, String whereClause, Object[] whereArgs) {
1184+
String[] args = new String[whereArgs.length];
1185+
for(int index = 0; index < whereArgs.length; index++) {
1186+
args[index] = whereArgs[index].toString();
1187+
}
1188+
return delete(table, whereClause, args);
1189+
}
1190+
1191+
@Override
1192+
public int update(String table, int conflictAlgorithm, ContentValues values, String whereClause, Object[] whereArgs) {
1193+
String[] args = new String[whereArgs.length];
1194+
for(int index = 0; index < whereArgs.length; index++) {
1195+
args[index] = whereArgs[index].toString();
1196+
}
1197+
return updateWithOnConflict(table, values, whereClause, args, conflictAlgorithm);
1198+
}
1199+
11051200
/**
11061201
* Mark this table as syncable. When an update occurs in this table the
11071202
* _sync_dirty field will be set to ensure proper syncing operation.

sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SQLiteOpenHelper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import net.zetetic.database.DatabaseErrorHandler;
2626
import net.zetetic.database.sqlcipher.SQLiteDatabase.CursorFactory;
2727
import android.util.Log;
28+
29+
import androidx.sqlite.db.SupportSQLiteOpenHelper;
30+
2831
import java.io.File;
2932
import java.nio.ByteBuffer;
3033
import java.nio.CharBuffer;
@@ -48,7 +51,7 @@
4851
* <p class="note"><strong>Note:</strong> this class assumes
4952
* monotonically increasing version numbers for upgrades.</p>
5053
*/
51-
public abstract class SQLiteOpenHelper {
54+
public abstract class SQLiteOpenHelper implements SupportSQLiteOpenHelper {
5255
private static final String TAG = SQLiteOpenHelper.class.getSimpleName();
5356

5457
// When true, getReadableDatabase returns a read-only database if it is just being opened.

sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SQLiteProgram.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import android.database.DatabaseUtils;
2424
import android.os.CancellationSignal;
2525

26+
import androidx.sqlite.db.SupportSQLiteProgram;
27+
2628
import java.util.Arrays;
2729

2830
/**
@@ -31,7 +33,7 @@
3133
* This class is not thread-safe.
3234
* </p>
3335
*/
34-
public abstract class SQLiteProgram extends SQLiteClosable {
36+
public abstract class SQLiteProgram extends SQLiteClosable implements SupportSQLiteProgram {
3537
private static final String[] EMPTY_STRING_ARRAY = new String[0];
3638

3739
private final SQLiteDatabase mDatabase;
@@ -88,7 +90,7 @@ final SQLiteDatabase getDatabase() {
8890
return mDatabase;
8991
}
9092

91-
final String getSql() {
93+
String getSql() {
9294
return mSql;
9395
}
9496

sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SQLiteStatement.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
import android.os.ParcelFileDescriptor;
2424

25+
import androidx.sqlite.db.SupportSQLiteStatement;
26+
2527
/**
2628
* Represents a statement that can be executed against a database. The statement
2729
* cannot return multiple rows or columns, but single value (1 x 1) result sets
@@ -30,7 +32,7 @@
3032
* This class is not thread-safe.
3133
* </p>
3234
*/
33-
public final class SQLiteStatement extends SQLiteProgram {
35+
public final class SQLiteStatement extends SQLiteProgram implements SupportSQLiteStatement {
3436
SQLiteStatement(SQLiteDatabase db, String sql, Object[] bindArgs) {
3537
super(db, sql, bindArgs, null);
3638
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package net.zetetic.database.sqlcipher;
2+
3+
import androidx.annotation.Nullable;
4+
import androidx.sqlite.db.SupportSQLiteDatabase;
5+
import androidx.sqlite.db.SupportSQLiteOpenHelper;
6+
7+
public class SupportHelper implements SupportSQLiteOpenHelper {
8+
9+
private SQLiteOpenHelper openHelper;
10+
11+
public SupportHelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook) {
12+
openHelper = new SQLiteOpenHelper(configuration.context, configuration.name, password,
13+
null, configuration.callback.version, configuration.callback.version,
14+
null, hook) {
15+
@Override
16+
public void onCreate(SQLiteDatabase db) {
17+
configuration.callback.onCreate(db);
18+
}
19+
20+
@Override
21+
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
22+
configuration.callback.onUpgrade(db, oldVersion, newVersion);
23+
}
24+
};
25+
}
26+
27+
@Nullable
28+
@Override
29+
public String getDatabaseName() {
30+
return openHelper.getDatabaseName();
31+
}
32+
33+
@Override
34+
public void setWriteAheadLoggingEnabled(boolean enabled) {
35+
openHelper.setWriteAheadLoggingEnabled(enabled);
36+
}
37+
38+
@Override
39+
public SupportSQLiteDatabase getWritableDatabase() {
40+
return openHelper.getWritableDatabase();
41+
}
42+
43+
@Override
44+
public SupportSQLiteDatabase getReadableDatabase() {
45+
return openHelper.getReadableDatabase();
46+
}
47+
48+
@Override
49+
public void close() {
50+
openHelper.close();
51+
}
52+
}

0 commit comments

Comments
 (0)
0