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框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钢铁小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值