# Android Room Library
###### tags: `Android`
**Dashboard use Android Room Library to implement database feature**
[reference]
```
https://developer.android.com/topic/libraries/architecture/room Room Persistence Library
```
## Introduction
Room provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of SQLite.
There are 3 major components in Room:
* Database
* Contains the database holder and serves as the main access point for the underlying connection to your app's persisted, relational data.
* The class that's annotated with '''@Database''' should satisfy the following conditions:
* Be an abstract class that extends '''RoomDatabase'''.
* Include the list of entities associated with the database within the annotation.
* Contain an abstract method that has 0 arguments and returns the class that is annotated with '''@Dao'''.
* At runtime, you can acquire an instance of Database by calling '''Room.databaseBuilder()''' or '''Room.inMemoryDatabaseBuilder()'''.
* Entity
* Represents a table within the database.
* DAO
* Contains the methods used for accessing the database.
This relationship among the different components of Room appears:

## Implement
The following code snippet contains a sample database configuration with one entity and one DAO:
* User
```
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
```
* UserDao
```
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
```
## Using in QIoT
QIoT use two tables to save data:
* Dashboad
```
@Entity(tableName = "Dashboard")
public class Dashboard implements Serializable {
@PrimaryKey(autoGenerate = true)
private int id;
private String title;
private int pin;
private int isShared;
private String user;
private int errorCode;
}
```
* WidgetInfo
```
@Entity(tableName = "WidgetInfo",
foreignKeys = {
@ForeignKey(entity = Dashboard.class,
parentColumns = "id",
childColumns = "dashboardId",
onDelete = ForeignKey.CASCADE)},
indices = {@Index(value = "dashboardId")
})
public class WidgetInfo implements Serializable, AppConstants {
@PrimaryKey(autoGenerate = true)
private int id;
private int dashboardId;
private String widgetType;
private String name;
private String host;
private int port;
private String username;
private String password;
private String clientId;
private String nasUniqueId;
private int resourceType;
private String thingId;
private String thingName;
private String resourceId;
private String resourceName;
private String resourceObjectId;
private String topic;
private ArrayList<String> keyValueList;
private ArrayList<String> labelList;
private ArrayList<Payload> payloadList;
private String unit;
private int chartStyle;
private int minValue;
private int maxValue;
private String videoUrl;
private String videoUsername;
private String videoPassword;
private boolean showMyLocation;
private String longitude = "";
private String latitude;
private String timeType;
private String startTime;
private String endTime;
private ElementLayoutParams elementLayoutParams;
private String color;
private String notificationId;
private String condition;
private int threshold;
private int errorCode;
}
```