一.简介:
room 在sqlite上提供了一个抽象层,以便在充分利用sqlite的强大功能的同时,能够流畅地访问数据库。
room包含3个主要组件:
数据库:包含数据库持有者,并作为应用已保留持久性关系型数据的底层连接的主要接入点。
@databa注释
1.是扩展roomdataba的抽象类。
2.在注释中添加与数据库关联的实体表。
3.包含具有0个参数且返回使用@dao 注释的类的抽象方法。
在运行时,您可以通过调用room.datababuilder()或room.inmemorydatababuilder()获取databa的实例。
@entity:表示数据库中的表
@dao:包含用于访问数据库的方法
二:依赖room数据库
1.在app模块下bulid.gradle 添加项目的依赖
//添加room依赖implementation 'androidx.room:room-runtime:2.2.5'annotationprocessor 'androidx.room:room-compiler:2.2.5'
三:创建一个实体类entity
@entitypublic class ur { @primarykey(autogenerate = true)//主键是否自动增长,默认为fal private int id; private string name; private int age; public int getid() { return id; } public void tid(int id) { this.id = id; } public string getname() { return name; } public void tname(string name) { this.name = name; } public int getage() { return age; } public void tage(int age) { this.age = age; }}
1.主键:每一个实体必须定义至少一个字段作为主键。
1.可以在实体中@primarykey(autogenerate = true)注解,同时你也可以使用autogenerate属性,可以通过room来自动分配id 2.也可以通过@entity@entity(primarykeys = {"id","name"})如果有组合主键
2.通常room会使用类名作为数据库的表名,如果你希望自定义表名在@entity(tablename = “my_ur”),注意: sqlite中,表名是不区分大小写的
3.room用变量名称作为数据库表的字段名称,如果你希望字段名称和变量名称不一样,在变量出添加
public class ur { @columninfo(name = "first_name") private s高考吃什么食物最好tring name; }
4.索引和唯一性
根据你操作数据的方式你可能需要通过索引来提高查询数据库的速度,通过@entity添加indices属性,有些字段设置唯一性,可以通过@index注解下设置unique为true
@entity(indices = {@index(value = "name",unique = true)})public class ur {private string name;}
5.定义对象之间的关系
由于sqlite是关系型数据库,你可以指定对象之前的关系,room是明确禁止直接使用关系,但room仍然允许你在实体之间定义外键。
例如:如果有另一个实体叫做book,你可以在ur实体下使用@foreignkey注解定义他们之间的关系。
@entity( foreignkeys = @foreignkey(entity = ur.class, parentcolumns = "id", childcolumns = "ur_id")//定义外键)public class book { @primarykey//定义主键 public int bookid; public string title; @columninfo(name = "ur_id")//定义数据库表中的字段名 public int urid; public int geturid() { return urid; } public void turid(int urid) { this.urid = urid; } public int getbookid() { return bookid; } public void tbookid(int bookid) { this.bookid = bookid; } public string gettitle() { return title; } public void ttit腾讯每日精选le(string title) { this.title = title; }}
6.创建嵌套对象
你可以使用@embedded批注来表示要分解到表中子字段的对象
例如:我们的ur类可以包含address类型的字段,它表示名为street,city,state和postcode的字段的组合。要将组合列分别存储在表中,请在ur类中包含使用@embedded注释的address字段
public class address { public string street; public string state; public string city; @columninfo(name = "post_code") public int postcode;}@entitypublic class ur { @primarykey public int id; public string firstname; @embedded public address address;}
故这个表示ur对象的表包含具有以下名称的列:id,firstname,street,state,city和post_code。
@embedded(prefix = “address_”)如果实体具有多个相同类型的嵌入字段,则可以通过设置prefix属性使得每一个列保持唯一,把address_嵌入到列名的开头
7.忽略成员变量
如果你不想保留某些成员变量,可以使用@ignore注解
@ignore//指示room需要忽略的字段private int age;
四:创建一个dao接口
dao包含用于访问数据库的方法,创建一个操作实体类用@dao进行注解
@inrt插入语句注释
@delete删除语句注释
@update()更新语句注释
@query(“lect * from ur where first_name=:name”)查询语句
@daopublic interface urdao { /*插入数据ur*/ @inrt void inrt(ur ur); @query("lect * from ur")//从ur表中查询所有,ur是ur实体类默认在room中创建的表,也可以通过@entity(tablename = "my_ur"),指定表名,故这个表名就变成my_ur list<ur> getallurs(); @query("lect * from ur where first_name=:name")//设置筛选条件name,来查询这个first_name是表名first_name字段,通过@columninfo(name = "first_name")来设置表字段名 list<ur> getursbyname(string name);}
五:创建一个数据库持有者类
@databa(entities = {ur.class},version = 6,exportschema = fal)public abstract class urdataba extends roomdataba { private static final string db_name="urdataba.db"; private static volatile urdataba instance;//创建单例 public static synchronized urdataba getinstance(context context){ if (instance==null){ instance=create(context); } return instance; } /** * 创建数据库*/ private static urdataba create(context context) { return room.datababuilder(context,urdataba.class,db_name) .allowmainthreadqueries()//允许在主线程操作数据库,一般不推荐;设置这个后主线程调用增删改查不会报错,否则会报错 .fallbacktodestructivemigration()//该方法能在升级异常重新创建地球是什么星数据库,但所有的数据都会丢失 .addmigrations(new migration(1,4) { @override public void migrate(@nonnull supportsqlitedataba databa) { databa.execsql("alter table ur add price text");//添加一个字段 price升级数据库版本到4 }}) .build(); } public abstract urdao geturdao();//这个是必要的,创建dao的抽象类}
注意:
1、编译时会检查sql语句是否正确
2、不要在主线程中进行数据库操作
3、roomdataba最好使用单例模式
如果不设置数据库在主珍妮姑娘读后感线程操作的话就会报错,错误提示为
故需要使用数据库最好在new thread().start()子线程中使用,或者handler 或者asynctask或者rxjava异步实现。
room数据库升级
//第一步修改版本号为2,要升级的版本@databa(entities = {ur.class},version = 2,exportschema = fal)//第二步,添加addmigrations()添加数据库升级 room.datababuilder(context,urdataba.class,db_name) .addmigrations(new migration(1,2) { @override public void migrate(@nonnull supportsqlitedataba databa) { databa.execsql("alter table ur add go text");//在ur 表中添加一个字段go 类型为text log.d("aa",databa.getversion()+""); } }) .build();//第三步在entity实体类ur中添加属性private string go;public string getgo() { return go;}public void tgo(string go) { this.go = go;}//这样数据库版本就升级到了2,就可以使用了
六:room数据库使用
通过开辟子线程插入一条数据,也可以结合rxjava和handler和asynctask等异步实现
ur ur=new ur();ur.tage(2223);ur.tname("eees");u工作压力太大怎么办r.tgo("wogo");new thread(new runnable() { @override public void run() { urdataba.getinstance(nineactivity.this).geturdao().inrt(ur); log.d("tag","插入一条数据"); }}).start();
本文发布于:2023-04-05 11:14:17,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/2ad55b84c50243e3c466626d30a685a8.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:android 数据库操作(常见的数据库管理系统).doc
本文 PDF 下载地址:android 数据库操作(常见的数据库管理系统).pdf
留言与评论(共有 0 条评论) |