Skip to content

Commit bd32b48

Browse files
committed
Add support for room inMemory databases
1 parent 43e48d1 commit bd32b48

File tree

8 files changed

+117
-12
lines changed

8 files changed

+117
-12
lines changed

app/src/main/java/com/sample/MainActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ protected void onCreate(Bundle savedInstanceState) {
138138
}
139139

140140
Utils.setCustomDatabaseFiles(getApplicationContext());
141+
Utils.setInMemoryRoomDatabases(userDBHelper.getInMemoryDatabase());
141142
}
142143

143144
public void showDebugDbAddress(View view) {

app/src/main/java/com/sample/database/room/UserDBHelper.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.sample.database.room;
22

3+
import android.arch.persistence.db.SupportSQLiteDatabase;
34
import android.arch.persistence.room.Room;
45
import android.content.Context;
56

@@ -15,7 +16,7 @@ public class UserDBHelper {
1516
private final AppDatabase inMemoryAppDatabase;
1617

1718
public UserDBHelper(Context context) {
18-
appDatabase = Room.databaseBuilder(context, AppDatabase.class, "User-Database")
19+
appDatabase = Room.databaseBuilder(context, AppDatabase.class, "User.db")
1920
.allowMainThreadQueries()
2021
.build();
2122
inMemoryAppDatabase = Room.inMemoryDatabaseBuilder(context, AppDatabase.class)
@@ -39,4 +40,7 @@ public int countInMemory() {
3940
return inMemoryAppDatabase.userDao().loadAll().size();
4041
}
4142

43+
public SupportSQLiteDatabase getInMemoryDatabase() {
44+
return inMemoryAppDatabase.getOpenHelper().getWritableDatabase();
45+
}
4246
}

app/src/main/java/com/sample/utils/Utils.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package com.sample.utils;
2121

22+
import android.arch.persistence.db.SupportSQLiteDatabase;
2223
import android.content.Context;
2324
import android.util.Pair;
2425
import android.widget.Toast;
@@ -71,4 +72,20 @@ public static void setCustomDatabaseFiles(Context context) {
7172
}
7273
}
7374

75+
public static void setInMemoryRoomDatabases(SupportSQLiteDatabase... database) {
76+
if (BuildConfig.DEBUG) {
77+
try {
78+
Class<?> debugDB = Class.forName("com.amitshekhar.DebugDB");
79+
Class[] argTypes = new Class[]{HashMap.class};
80+
HashMap<String, SupportSQLiteDatabase> inMemoryDatabases = new HashMap<>();
81+
// set your inMemory database
82+
inMemoryDatabases.put("InMemoryOne.db", database[0]);
83+
Method setRoomInMemoryDatabase = debugDB.getMethod("setInMemoryRoomDatabases", argTypes);
84+
setRoomInMemoryDatabase.invoke(null, inMemoryDatabases);
85+
} catch (Exception ignore) {
86+
87+
}
88+
}
89+
}
90+
7491
}

debug-db/src/main/java/com/amitshekhar/DebugDB.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package com.amitshekhar;
2121

22+
import android.arch.persistence.db.SupportSQLiteDatabase;
2223
import android.content.Context;
2324
import android.util.Log;
2425
import android.util.Pair;
@@ -79,6 +80,12 @@ public static void setCustomDatabaseFiles(HashMap<String, Pair<File, String>> cu
7980
}
8081
}
8182

83+
public static void setInMemoryRoomDatabases(HashMap<String, SupportSQLiteDatabase> databases) {
84+
if (clientServer != null) {
85+
clientServer.setInMemoryRoomDatabases(databases);
86+
}
87+
}
88+
8289
public static boolean isServerRunning() {
8390
return clientServer != null && clientServer.isRunning();
8491
}

debug-db/src/main/java/com/amitshekhar/server/ClientServer.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525

2626

27+
import android.arch.persistence.db.SupportSQLiteDatabase;
2728
import android.content.Context;
2829
import android.util.Log;
2930
import android.util.Pair;
@@ -40,13 +41,10 @@ public class ClientServer implements Runnable {
4041
private static final String TAG = "ClientServer";
4142

4243
private final int mPort;
43-
44+
private final RequestHandler mRequestHandler;
4445
private boolean mIsRunning;
45-
4646
private ServerSocket mServerSocket;
4747

48-
private final RequestHandler mRequestHandler;
49-
5048
public ClientServer(Context context, int port) {
5149
mRequestHandler = new RequestHandler(context);
5250
mPort = port;
@@ -91,6 +89,10 @@ public void setCustomDatabaseFiles(HashMap<String, Pair<File, String>> customDat
9189
mRequestHandler.setCustomDatabaseFiles(customDatabaseFiles);
9290
}
9391

92+
public void setInMemoryRoomDatabases(HashMap<String, SupportSQLiteDatabase> databases) {
93+
mRequestHandler.setInMemoryRoomDatabases(databases);
94+
}
95+
9496
public boolean isRunning() {
9597
return mIsRunning;
9698
}

debug-db/src/main/java/com/amitshekhar/server/RequestHandler.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package com.amitshekhar.server;
2121

22+
import android.arch.persistence.db.SupportSQLiteDatabase;
2223
import android.content.Context;
2324
import android.content.res.AssetManager;
2425
import android.net.Uri;
@@ -30,6 +31,7 @@
3031
import com.amitshekhar.model.TableDataResponse;
3132
import com.amitshekhar.model.UpdateRowResponse;
3233
import com.amitshekhar.sqlite.DebugSQLiteDB;
34+
import com.amitshekhar.sqlite.InMemoryDebugSQLiteDB;
3335
import com.amitshekhar.sqlite.SQLiteDB;
3436
import com.amitshekhar.utils.Constants;
3537
import com.amitshekhar.utils.DatabaseFileProvider;
@@ -66,6 +68,7 @@ public class RequestHandler {
6668
private HashMap<String, Pair<File, String>> mDatabaseFiles;
6769
private HashMap<String, Pair<File, String>> mCustomDatabaseFiles;
6870
private String mSelectedDatabase = null;
71+
private HashMap<String, SupportSQLiteDatabase> mRoomInMemoryDatabases = new HashMap<>();
6972

7073
public RequestHandler(Context context) {
7174
mContext = context;
@@ -162,19 +165,25 @@ public void setCustomDatabaseFiles(HashMap<String, Pair<File, String>> customDat
162165
mCustomDatabaseFiles = customDatabaseFiles;
163166
}
164167

168+
public void setInMemoryRoomDatabases(HashMap<String, SupportSQLiteDatabase> databases) {
169+
mRoomInMemoryDatabases = databases;
170+
}
171+
165172
private void writeServerError(PrintStream output) {
166173
output.println("HTTP/1.0 500 Internal Server Error");
167174
output.flush();
168175
}
169176

170177
private void openDatabase(String database) {
171178
closeDatabase();
172-
File databaseFile = mDatabaseFiles.get(database).first;
173-
String password = mDatabaseFiles.get(database).second;
174-
175-
SQLiteDatabase.loadLibs(mContext);
176-
177-
sqLiteDB = new DebugSQLiteDB(SQLiteDatabase.openOrCreateDatabase(databaseFile.getAbsolutePath(), password, null));
179+
if (mRoomInMemoryDatabases.containsKey(database)) {
180+
sqLiteDB = new InMemoryDebugSQLiteDB(mRoomInMemoryDatabases.get(database));
181+
} else {
182+
File databaseFile = mDatabaseFiles.get(database).first;
183+
String password = mDatabaseFiles.get(database).second;
184+
SQLiteDatabase.loadLibs(mContext);
185+
sqLiteDB = new DebugSQLiteDB(SQLiteDatabase.openOrCreateDatabase(databaseFile.getAbsolutePath(), password, null));
186+
}
178187
isDbOpened = true;
179188
}
180189

@@ -198,6 +207,12 @@ private String getDBListResponse() {
198207
response.rows.add(dbEntry);
199208
}
200209
}
210+
if (mRoomInMemoryDatabases != null) {
211+
for (HashMap.Entry<String, SupportSQLiteDatabase> entry : mRoomInMemoryDatabases.entrySet()) {
212+
String[] dbEntry = {entry.getKey(), "false"};
213+
response.rows.add(dbEntry);
214+
}
215+
}
201216
response.rows.add(new String[]{Constants.APP_SHARED_PREFERENCES, "false"});
202217
response.isSuccessful = true;
203218
return mGson.toJson(response);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.amitshekhar.sqlite;
2+
3+
import android.arch.persistence.db.SupportSQLiteDatabase;
4+
import android.content.ContentValues;
5+
import android.database.Cursor;
6+
import android.database.SQLException;
7+
8+
/**
9+
* Created by anandgaurav on 12/02/18.
10+
*/
11+
12+
public class InMemoryDebugSQLiteDB implements SQLiteDB {
13+
14+
private final SupportSQLiteDatabase database;
15+
16+
public InMemoryDebugSQLiteDB(SupportSQLiteDatabase database) {
17+
this.database = database;
18+
}
19+
20+
@Override
21+
public int delete(String table, String whereClause, String[] whereArgs) {
22+
return database.delete(table, whereClause, whereArgs);
23+
}
24+
25+
@Override
26+
public boolean isOpen() {
27+
return database.isOpen();
28+
}
29+
30+
@Override
31+
public void close() {
32+
// no ops
33+
}
34+
35+
@Override
36+
public Cursor rawQuery(String sql, String[] selectionArgs) {
37+
return database.query(sql, selectionArgs);
38+
}
39+
40+
@Override
41+
public void execSQL(String sql) throws SQLException {
42+
database.execSQL(sql);
43+
}
44+
45+
@Override
46+
public long insert(String table, String nullColumnHack, ContentValues values) {
47+
return database.insert(table, 0, values);
48+
}
49+
50+
@Override
51+
public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {
52+
return database.update(table, 0, values, whereClause, whereArgs);
53+
}
54+
55+
@Override
56+
public int getVersion() {
57+
return database.getVersion();
58+
}
59+
}

debug-db/src/main/java/com/amitshekhar/utils/Utils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public static byte[] loadContent(String fileName, AssetManager assetManager) thr
8484
}
8585

8686
public static byte[] getDatabase(String selectedDatabase, HashMap<String, Pair<File, String>> databaseFiles) {
87-
if (TextUtils.isEmpty(selectedDatabase)) {
87+
if (TextUtils.isEmpty(selectedDatabase) || !databaseFiles.containsKey(selectedDatabase)) {
8888
return null;
8989
}
9090

0 commit comments

Comments
 (0)