android数据库操作(常见的数据库管理系统)

ndroid数据库Room的开发使用详解一.简介:Room在SQLite上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能够流畅地访问数据库。Room包含3个主要组件:数据库:包含数据库持有者,并作为应用已保留持久性关系型数据的底

ndroid 数据库Room的开发使用详解

一.简介:

Room 在SQLite上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能够流畅地访问数据库。

Room包含3个主要组件:

数据库:包含数据库持有者,并作为应用已保留持久性关系型数据的底层连接的主要接入点。

@Database注释

1.是扩展RoomDatabase的抽象类。

2.在注释中添加与数据库关联的实体表。

3.包含具有0个参数且返回使用@Dao 注释的类的抽象方法。

在运行时,您可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取Database的实例。

@Entity:表示数据库中的表

@Dao:包含用于访问数据库的方法

android数据库操作(常见的数据库管理系统)

二:依赖Room数据库

1.在App模块下bulid.Gradle 添加项目的依赖

//添加Room依赖
implementation \'androidx.room:room-runtime:2.2.5\'
annotationProcessor \'androidx.room:room-compiler:2.2.5\'

android数据库操作(常见的数据库管理系统)

三:创建一个实体类Entity

@Entity
public class User {
@PrimaryKey(autoGenerate = true)//主键是否自动增长,默认为false
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

android数据库操作(常见的数据库管理系统)

1.主键:每一个实体必须定义至少一个字段作为主键。

1.可以在实体中@PrimaryKey(autoGenerate = true)注解,同时你也可以使用autoGenerate属性,可以通过Room来自动分配ID
2.也可以通过@Entity@Entity(primaryKeys = {\"id\",\"name\"})如果有组合主键

2.通常Room会使用类名作为数据库的表名,如果你希望自定义表名在@Entity(tableName = “my_user”),注意: SQLite中,表名是不区分大小写的

3.Room用变量名称作为数据库表的字段名称,如果你希望字段名称和变量名称不一样,在变量出添加

public class User {
@ColumnInfo(name = \"first_name\")
private String name;
}

4.索引和唯一性

根据你操作数据的方式你可能需要通过索引来提高查询数据库的速度,通过@Entity添加indices属性,有些字段设置唯一性,可以通过@Index注解下设置unique为true

@Entity(indices = {@Index(value = \"name\",unique = true)})
public class User {
private String name;
}

5.定义对象之间的关系

由于SQLite是关系型数据库,你可以指定对象之前的关系,Room是明确禁止直接使用关系,但Room仍然允许你在实体之间定义外键。

例如:如果有另一个实体叫做Book,你可以在User实体下使用@ForeignKey注解定义他们之间的关系。

@Entity(
foreignKeys = @ForeignKey(entity = User.class, parentColumns = \"id\",
childColumns = \"user_id\")//定义外键
)
public class Book {
@PrimaryKey//定义主键
public int bookId;
public String title;
@ColumnInfo(name = \"user_id\")//定义数据库表中的字段名
public int userId;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

6.创建嵌套对象

你可以使用@Embedded批注来表示要分解到表中子字段的对象

例如:我们的User类可以包含Address类型的字段,它表示名为street,city,state和postCode的字段的组合。要将组合列分别存储在表中,请在User类中包含使用@Embedded注释的Address字段

public class Address {
public String street;
public String state;
public String city;

@ColumnInfo(name = \"post_code\")
public int postCode;
}

@Entity
public class User {
@PrimaryKey
public int id;

public String firstName;

@Embedded
public Address address;
}

故这个表示User对象的表包含具有以下名称的列:id,firstName,street,state,city和post_code。

@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”)查询语句

@Dao
public interface UserDao {
/*插入数据User*/
@Insert
void insert(User user);
@Query(\"SELECT * FROM user\")//从user表中查询所有,user是User实体类默认在Room中创建的表,也可以通过@Entity(tableName = \"my_user\"),指定表名,故这个表名就变成my_user
List<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();
}

public abstract UserDao getUserDao();//这个是必要的,创建DAO的抽象类
}

注意:

1、编译时会检查SQL语句是否正确

2、不要在主线程中进行数据库操作

3、RoomDatabase最好使用单例模式

如果不设置数据库在主线程操作的话就会报错,错误提示为

android数据库操作(常见的数据库管理系统)

故需要使用数据库最好在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();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/17950.html

(0)
nan
上一篇 2021-08-28
下一篇 2021-08-28

相关推荐

  • php字符串匹配的方法有哪些

    在PHP中,可以使用以下方法进行字符串匹配:使用 strpos() 函数:该函数可以返回字符串中第一次出现指定子字符串的位置。如果未找到匹配项,则返回 false。$string = “Hello, world!”;$substring = “world”;if(strpos($string, $substring) !== false){echo “Match found!”;} else

    2024-04-28
    0
  • centos7怎么重启网卡服务

    在CentOS 7中,可以使用以下命令重启网络服务:使用以下命令列出当前网络接口名称:ip a确定要重启的网络接口名称。通常情况下,以en或eth开头的接口名称为以太网接口,以wl或wlan开头的接口名称为无线接口。使用以下命令重启网络服务,其中interface_name为要重启的网络接口名称:sudo systemctl restart network例如,如果要重启以太网接口,可以

    2024-01-29
    0
  • anaconda中怎么配置虚拟python环境

    在Anaconda中配置虚拟Python环境可以使用conda命令来创建和管理环境。以下是在Anaconda中配置虚拟Python环境的步骤:打开Anaconda Prompt(Windows)或Terminal(macOS和Linux)。创建一个新的虚拟环境,可以使用以下命令:conda create –name myenv python=3.7这将创建一个名为myenv的Python 3.7

    2024-03-30
    0
  • 如何提高百度收录率(怎么能快速增加百度收录)

    如何提高百度收录率,怎么能快速增加百度收录内容导航:如何提高百度收录率如何提高百度的收录率新网站怎么提高百度的收录率怎么样提高百度收录率一、如何提高百度收录率我觉得可以分为前端和文章2块来认定。前端主要是你的网站速度要快,结构合理,建议使用div标签,页面大小适合,标签尽量附合W3C标准。第二部份文章最好原创,或者伪

    2022-04-24
    0
  • SQLServer数据批量导出的方法是什么

    在SQL Server中,可以使用bcp命令行实用程序来进行数据批量导出。以下是具体的步骤:打开命令提示符(cmd)窗口。输入以下命令来导出数据:bcp [数据库名].[模式名].[表名] out [导出文件路径] -c -T其中,数据库名是要导出数据的数据库名称,模式名是表所在的模式名称,表名是要导出数据的表名称,导出文件路径是要导出数据的文件路径。-c表示使用字符数据类型,-T表示使用Win

    2024-03-28
    0
  • db2数据库在线备份的方法是什么

    在DB2数据库中进行在线备份有多种方法,其中最常用的方法包括:使用命令行工具进行在线备份:可以使用db2备份命令来进行在线备份,语法如下:db2 backup database to online使用Control Center进行在线备份:可以使用DB2 Control Center软件进行在线备份,通过界面操作来完成备份任务

    2024-04-09
    0

发表回复

登录后才能评论