Room谷歌公司推出的数据库处理框架,给予sqlite,通过注解技术简化数据库操作
框架导入:
实体类-@Entity
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class BookInfo {
//主键(自动增长)
@PrimaryKey(autoGenerate = true)
private int id;
private String bookName;
private double price;
}
再加上get、set、toString方法
持久化类-@Dao
该类仅需编写接口,不需编写Impl实现类
支持可变参数("...")即传入多个参数
@Dao
public interface BookDao {
@Insert
void insert(BookInfo... book); //添加,"..."表示支持可变参数,可以传入多个
@Delete
void delete(BookInfo... book); //删除
@Query("DELETE FROM BookInfo")
void deleteAll(); //清空表
@Update
int update(BookInfo... book); //修改
@Query("select * from BookInfo")
List<BookInfo> findAll(); //查询全部
@Query("SELECT * FROM BookInfo WHERE bookName = :name ORDER BY id DESC limit 1")
BookInfo findByName(String name); //精准查询,只查一条
}
database抽象类
提供Dao的实例
//entities表示数据库有哪些表
//exportSchema是否对执行的sql语句做记录,保存至文件中
@Database(entities = {BookInfo.class},version = 1,exportSchema = true)
public abstract class BookDataBase extends RoomDatabase {
public abstract BookDao bookDao();
}
指定sql语句文件保存位置:
在配置文件中,不同的后缀名格式有差:
在MyApplication构造database实例
1.声明一个database对象
2.在onCreate中通过Room.databaseBuilder构建数据库
private BookDataBase bookDataBase;
//传入参数:上下文、数据库类、数据库名称
bookDataBase = Room.databaseBuilder(this,BookDataBase.class,"book")
//允许迁移数据库(默认数据变更时,会删除原来的数据库再创建)
.addMigrations()
//允许在主线程中操作数据库(耗时)、通常/默认不允许在主线程中操作数据库
.allowMainThreadQueries()
.build();
MyApplication提供对外获取数据库实例的方法
public BookDataBase getBookDB(){
return bookDataBase;
}
在activity中获取Dao实例,调用相关方法实现增删查改
//从APP实例中获取唯一的持久化对象
BookDao bookDao = myApplication.getInstance().getBookDB().bookDao();
//声明一个实体类对象
BookInfo book = new BookInfo();
//填充各字段信息
book.setBookName(name);
book.setPrice(Double.parseDouble(price));
//添加
bookDao.insert(book);
//查询并打印结果
List<BookInfo> list = bookDao.findAll();
for (BookInfo bookInfo: list) {
Log.d("book",bookInfo.toString());
}
//修改
BookInfo bookInfo1 = new BookInfo();
//查询到数据库原有的数据
BookInfo b1 = bookDao.findByName(name);
bookInfo1.setId(b1.getId()); //id不变
//修改其他内容
bookInfo1.setBookName(name);
bookInfo1.setPrice(Double.parseDouble(price));
bookDao.update(bookInfo1);
//删除--根据id删除
BookInfo bookInfo = new BookInfo();
BookInfo b1 = bookDao.findByName(name);
bookInfo.setId(b1.getId());
bookDao.delete(bookInfo);