Issue
Good day Stack, i'm working on an Android project that uses Android's Room 1.0.0 Alpha 5, the main issue that i'm facing is that every time i need to call one of the DAO from room i need to do something like this:
Activity.java:
...
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "Storage").build();
Table1 table = new Table1();
table.setId(1);
table.setName("Hello");
new AccessDB().execute(1);
/* Generic AccessDB needed */
private class AccessDB extends AsyncTask<Integer,Void,List<Table1>> {
@Override
protected List<Table1> doInBackground(Integer... param) {
switch(param[0]) {
case 1:
return db.Table1DAO().create();
case 2:
return db.Table1DAO().read();
}
return new ArrayList<>();
}
@Override
protected void onPostExecute(List<Table1> list) {
processData(list);
}
}
...
I know that i can access Room DB from the main thread, and that would shrink the code, but i think that's not a good practice since that would lock the activity every time it has to handle data.
So if i need to insert or read data from "Table2" i would have to do the same all over again, it would be great if i could turn the entity types into generics like "T" or something like that and then make a generic "AccessDB". But since i'm not too familiar with Java... I'm currently struggling with this.
Here is some other code of the instances.
AppDatabase.java:
@Database(entities = {Table1.class, Table2.class, Table3.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract Table1DAO Table1DAO();
public abstract Table2DAO Table2DAO();
public abstract Table3DAO Table3DAO();
}
Table1.java:
@Entity
public class Table1 {
/* setters & getters */
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
}
Table1DAO.java:
@Dao public interface Table1DAO {
@Query("SELECT * FROM Table1")
List<Table1> read(Table1 table);
@Insert(onConflict = OnConflictStrategy.REPLACE)
List<Long> create(Table1... table);
}
Thank you all for your help.
Solution
You can use inheritance and create a BaseDao
which will be implemented by all your child Dao
. This way you won't need to write the common methods again and again.
interface BaseDao<T> {
/**
* Insert an object in the database.
*
* @param obj the object to be inserted.
*/
@Insert
fun insert(obj: T)
/**
* Insert an array of objects in the database.
*
* @param obj the objects to be inserted.
*/
@Insert
fun insert(vararg obj: T)
/**
* Update an object from the database.
*
* @param obj the object to be updated
*/
@Update
fun update(obj: T)
/**
* Delete an object from the database
*
* @param obj the object to be deleted
*/
@Delete
fun delete(obj: T)
}
Read more about it: https://gist.github.com/florina-muntenescu/1c78858f286d196d545c038a71a3e864#file-basedao-kt
Original credits to Florina.
Answered By - Akshay Chordiya
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.