Fixed
Status Update
Comments
da...@google.com <da...@google.com> #2
hmm room builder cannot take converters because we need them at compile time BUT we can receive a converter factory instead of initializing them ourselves.
Then one can write a type converter producer similar to view models .
https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/viewmodel/GithubViewModelFactory.kt
Then one can write a type converter producer similar to view models .
kp...@gmail.com <kp...@gmail.com> #3
Yes, that would be very much appreciated!
da...@google.com <da...@google.com> #4
Hey guys.
Has any progress been made on this issue? It's really frustrating to not be able to inject my own dependencies into type converter classes.
Has any progress been made on this issue? It's really frustrating to not be able to inject my own dependencies into type converter classes.
ap...@google.com <ap...@google.com> #5
Unfortunately no :( Any we ahve very resource constraint right now to prioritize it. If you would like to help, i'm happy to help you through the aosp setup.
Description
Version used: Room 2.0.0-alpha05
Devices/Android versions reproduced on: Any
Recent deprecations influence business logic flow a lot. Example: remote server's response parsing (I think, rather common case).
Old way:
// JSONException is thrown upper, so it can be managed alltogether with HTTP response errors (for example, just ignored to use old data on unexpected response format)
public void parseResponse(final JSONObject obj, final JSONArray subObjs) throws JSONException
{
db.beginTransaction();
try {
final DBItem item = db.getDaoItem().findItem(obj.getLong("id"));
item.parseSomehow(obj); // throws JSONException on failure
final DBSubItem[] subitems = db.getDaoSubItem().findSubItems(item.getId());
db.getDaoSubItem().replaceSubItems(item.getId(), DBSubItem.parseSomehow(subObjs)); // replaces, reusing subitems with updating inner order; throws JSONException on failure
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
New way (looks worse, no exception type control - so you can throw anything and check it only in runtime):
public void parseResponse(final JSONObject obj, final JSONArray subObjs) throws JSONException
{
try {
db.runInTransaction(() -> {
... // same code as in previous example inside try...catch
return null;
});
} catch (RuntimeException e) {
if (e.getCause() instanceof JSONException) {
throw (JSONException)e.getCause();
} else {
throw e;
}
}
}
Of course, I can try to separate parsing from database interaction, but it would require at least temporary objects with no more usage (in the project's code). Additionally, sometimes next parsing steps depend on previous / storage data.
Final thoughts. Looks like runInTransaction should be recommended method in most situations, but the old way is still convenient too.