@Embedded(prefix = “address_”)如果实体具有多个相同类型的嵌入字段,则可以通过设置prefix属性使得每一个列保持唯一,把address_嵌入到列名的开头
7.忽略成员变量
如果你不想保留某些成员变量,可以使用@Ignore注解
@Ignore//指示Room需要忽略的字段private int age;四:创建一个Dao接口
Dao包含用于访问数据库的方法,创建一个操作实体类用@Dao进行注解
@Insert插入语句注释
@Delete删除语句注释
@Update()更新语句注释
@Query(“SELECT * FROM user WHERE first_name=:name”)查询语句
@Daopublic interface UserDao {/*插入数据User*/ @Insert void insert(User user); @Query("SELECT * FROMuser")//从user表中查询所有,user是User实体类默认在Room中创建的表,也可以通过@Entity(tableName = "my_user"),指定表名,故这个表名就变成my_userList<User> getAllUsers(); @Query("SELECT * FROM user WHERE first_name=:name")//设置筛选条件name,来查询这个first_name是表名first_name字段,通过@ColumnInfo(name = "first_name")来设置表字段名List<User> getUsersByName(String name);}五:创建一个数据库持有者类
@Database(entities = {User.class},version = 6,exportSchema = false)public abstract class UserDatabase extends RoomDatabase {private static final String DB_NAME="UserDatabase.db"; private static volatile UserDatabase instance;//创建单例 public static synchronized UserDatabase getInstance(Context context){if (instance==null){instance=create(context); }return instance; } /** * 创建数据库*/private static UserDatabase create(Context context) {return Room.databaseBuilder(context,UserDatabase.class,DB_NAME).allowMainThreadQueries()//允许在主线程操作数据库,一般不推荐;设置这个后主线程调用增删改查不会报错,否则会报错.fallbackToDestructiveMigration()//该方法能在升级异常重新创建数据库,但所有的数据都会丢失.addMigrations(new Migration(1,4) {@Override public void migrate(@NonNull SupportSQLiteDatabase database) {database.execSQL("alter table user add price TEXT");//添加一个字段 price升级数据库版本到4 }}).build(); }publicabstract UserDao getUserDao();//这个是必要的,创建DAO的抽象类}注意:
1、编译时会检查SQL语句是否正确
2、不要在主线程中进行数据库操作
3、RoomDatabase最好使用单例模式
如果不设置数据库在主线程操作的话就会报错,错误提示为
故需要使用数据库最好在new Thread().start()子线程中使用,或者Handler 或者AsyncTask或者RXJava异步实现 。
Room数据库升级
//第一步修改版本号为2,要升级的版本@Database(entities = {User.class},version = 2,exportSchema = false)//第二步,添加addMigrations()添加数据库升级 Room.databaseBuilder(context,UserDatabase.class,DB_NAME).addMigrations(new Migration(1,2) {@Override public void migrate(@NonNull SupportSQLiteDatabase database) {database.execSQL("alter table user add go TEXT");//在user 表中添加一个字段go 类型为TEXT Log.d("aa",database.getVersion()+""); }}).build();//第三步在Entity实体类User中添加属性private String go;public String getGo() {return go;}public void setGo(String go) {this.go = go;}//这样数据库版本就升级到了2,就可以使用了六:Room数据库使用
通过开辟子线程插入一条数据,也可以结合RXJava和Handler和AsyncTask等异步实现
User user=new User();user.setAge(2223);user.setName("eees");user.setGo("wogo");new Thread(new Runnable() {@Override public void run() {UserDatabase.getInstance(NineActivity.this).getUserDao().insert(user); Log.d("TAG","插入一条数据"); }}).start();
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 细数男人增肌的健身误区
- 户外也能增肌的简单动作
- 健身最简单高效的瑜伽动作
- 目前最好用的cad版本 cad如何安装插件的命令
- 自制拍网的制作视频 个人视频网站应该怎么做
- 创建分区的操作步骤 win10笔记本分区步骤
- 免费的h5制作网站 h5表单制作教程
- 推荐口碑最好的充电宝 2021年充电宝排行榜
- 有没有不用互联网就可以拍照和搜题的方法? 拍照搜题在线使用一下
- 消防烟感探测器的作用