Android Room框架学习记录
参考博客
Android Room使用
Android Room 框架学习
AndroidX Room管理数据库
Android room存储高级数据类型
一、添加依赖
dependencies {
...
implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
}
Androidx
dependencies {
...
implementation 'androidx.room:room-runtime:2.0.0'
annotationProcessor 'androidx.room:room-compiler:2.0.0'
}
二、具体实现
1.Entity(实体)
转载于第二个参考博客
@Entity注解包含的属性有:
1.tableName:设置表名字。默认是类的名字。
2.indices:设置索引。
3.inheritSuperIndices:父类的索引是否会自动被当前类继承。
4.primaryKeys:设置主键。
5.foreignKeys:设置外键。
@ColumnInfo(name = “UserId”) 字段名称,可修改数据表中显示的字段名称,默认为属性名
@NonNull 设置非空
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "steps")
public class Steps{
@PrimaryKey(autoGenerate = true)
public int id;
public long time;
public long step;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public long getStep() {
return step;
}
public void setStep(long step) {
this.step = step;
}
}
2.RoomDatabase
每次创建Database实例都会产生比较大的开销,所以参照了大佬的项目设计成单例的,或者在Application中实现。如果有多个表,在entities中添加
version – 是数据库的版本号
import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import com.example.runningman.dao.PointsDao;
import com.example.runningman.dao.StepsDao;
import com.example.runningman.model.BaiduPoints;
import com.example.runningman.model.Steps;
@Database(entities = {Steps.class},version = 1, exportSchema = false)
public abstract class BaiduPointsDatebase extends RoomDatabase {
private volatile static BaiduPointsDatebase INSTANCE;
private static final Object sLock = new Object();
public abstract PointsDao getPointsDao();
public abstract StepsDao StepsDao();
public static BaiduPointsDatebase getInstance(Context context) { //单例模式
if (INSTANCE == null) {
synchronized (BaiduPointsDatebase.class) {
if (INSTANCE == null) {
INSTANCE =
Room.databaseBuilder(context.getApplicationContext(), BaiduPointsDatebase.class, "points.db")
.allowMainThreadQueries()
.build();
}
}
}
return INSTANCE;
}
}
3.Dao
onConflict:默认值是OnConflictStrategy.ABORT,表示当插入有冲突的时候的处理策略。OnConflictStrategy封装了Room解决冲突的相关策略:(转载于第二个参考博客)
1. OnConflictStrategy.REPLACE:冲突策略是取代旧数据同时继续事务。
2. OnConflictStrategy.ROLLBACK:冲突策略是回滚事务。
3. OnConflictStrategy.ABORT:冲突策略是终止事务。
4. OnConflictStrategy.FAIL:冲突策略是事务失败。
5. OnConflictStrategy.IGNORE:冲突策略是忽略冲突。
StepsDao.java
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import com.example.runningman.model.Steps;
import java.util.List;
@Dao
public interface StepsDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
//修饰词的作用在于让系统编译的时候自动生成相关的代码
// Steps...表示可以传递一个或者多个参数,返回值可以是void或者是long 返回一个插入后的id
void insertPoints(Steps... Steps);
@Query("SELECT * FROM steps ")
List<Steps> selectAllSteps();
}
4.在activity中实现
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Steps steps=new Steps();
steps.setStep((int)mSteps);
steps.setTime(System.currentTimeMillis());
stepsDao=BaiduPointsDatebase.getInstance(this).StepsDao();
stepsDao.insertPoints(steps);
List<Steps> list=stepsDao.selectAllSteps();
}
}
以上就大概实现了Room框架。