android专题-数据库Room

Room介绍

room是Google官方推荐的ORM数据库框架,抽象出sqlite访问的数据库。
包含三大组件:

  • Entity 定义 表结构,每个entity类对一个表,默认会把entity类所有字段都创建为表字段
  • Dao 定义entity类的CRUD(增删查改)功能
  • Database 数据库的访问入口,注解定义数据库的实体表,数据库版本控制,表结构导出、表结构修改等都在这里处理

步骤

1.添加依赖

 def room_version = '2.3.0-alpha04'implementation rootProject.ext.dependencies.room_runtimeannotationProcessor rootProject.ext.dependencies.room_compilerandroidTestImplementation rootProject.ext.dependencies.room_testing

2.定义Entity实体表

@Entity 注解并在@Database 注解中的 entities 属性所引用,Room就会在数据库中为这个被 @Entity 注解的类创建一张表
@PrimaryKey 每个entity至少要有一个主键(PrimaryKey),autoGenerate表示这个值自动生成
@Entity(primaryKeys = {“xxx”, “xxx”}) 如果是复合主键的话, 你需要使用注解@Entity的primaryKeys属性

@Entity(primaryKeys = {"firstName", "lastName"})
public class User {public String firstName;public String lastName;@IgnoreBitmap picture;
}

@ColumnInfo(name = “xxx”) 定义表字段,也可以不使用此注解,默认为所有属性生成表字段
@Ignore 如果Engity类中某个属性不想保存到数据库,可以使用@Ignore注解忽略

@Entity
public class User {@PrimaryKeypublic int id;public String firstName;public String lastName;@IgnoreBitmap picture;
}

@Entity(indices = {@Index(“name”), @Index(value = {“last_name”, “address”})}) 为了加速查询速度. 要给实体添加索引

@Entity(indices = {@Index("name"),@Index(value = {"last_name", "address"})})
public class User {@PrimaryKeypublic int id;public String firstName;public String address;@ColumnInfo(name = "last_name")public String lastName;@IgnoreBitmap picture;
}

@Entity(foreignKeys = @ForeignKey(entity = User.class,
parentColumns = “id”,
childColumns = “user_id”)) 设置外键

@Entity(foreignKeys = @ForeignKey(entity = User.class,parentColumns = "id",childColumns = "user_id"))
public class Book {@PrimaryKeypublic int bookId;public String title;@ColumnInfo(name = "user_id")public int userId;
}

@Embedded注解来表示一个对象

public class Address {public String street;public String state;public String city;@ColumnInfo(name = "post_code")public int postCode;
}
@Entity
public class User {@PrimaryKeypublic int id;public String firstName;@Embeddedpublic Address address;
}

demo:

package com.wrs.project.module.app.common.database.entity;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import androidx.annotation.NonNull;@Entity(tableName = "Article")
public class Article {@PrimaryKey(autoGenerate = true)private int id;private String author;private String title;private String content;private String token;private int comments;public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getToken() {return token;}public void setToken(String token) {this.token = token;}public int getComments() {return comments;}public void setComments(int comments) {this.comments = comments;}
}

3. 定义DAO

简单查询

@Dao
public interface MyDao {@Insert(onConflict = OnConflictStrategy.REPLACE)public void insertUsers(User... users);@Insertpublic void insertBothUsers(User user1, User user2);@Insertpublic void insertUsersAndFriends(User user, List<User> friends);
}

嵌套查询

@Dao
public interface MyDao {@Query("SELECT * FROM book "+ "INNER JOIN loan ON loan.book_id = book.id "+ "INNER JOIN user ON user.id = loan.user_id "+ "WHERE user.name LIKE :userName")public List<Book> findBooksBorrowedByNameSync(String userName);
}
@Dao
public interface MyDao {@Query("SELECT user.name AS userName, pet.name AS petName "+ "FROM user, pet "+ "WHERE user.id = pet.user_id")public LiveData<List<UserPet>> loadUserAndPetNames();// You can also define this class in a separate file, as long as you add the// "public" access modifier.static class UserPet {public String userName;public String petName;}
}

demo

package com.wrs.project.module.app.common.database.dao;import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;import com.wrs.project.module.app.common.database.entity.Article;import java.util.List;@Dao
public interface ArticleDao {/*** 增* @param entities*/@Insertvoid insert(Article... entities);/*** 删* @param entities*/@Deletevoid delete(Article... entities);/*** 查* @param title*/@Query("SELECT * FROM Article WHERE title = :title")List<Article> findByTitle(String title);/*** 查* @param titles*/@Query("SELECT * FROM Article WHERE title IN (:titles)")List<Article> findInTitles(List<String> titles);/*** 改* @param entities*/@Updatevoid update(Article... entities);@Insert(onConflict = OnConflictStrategy.REPLACE)List<Long> insertAll(List<Article> entities);@Deletevoid delete(Article entity);@Query("DELETE FROM Article")void deleteAll();@Deletevoid deleteArticle(Article entity);@Query("SELECT * FROM Article")List<Article> findAll();@Query("SELECT * FROM Article")LiveData<List<Article>> loadSignList();
}

4. 定义Database

package com.wrs.project.module.app.common.database;import android.content.Context;import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.TypeConverters;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;import com.wrs.project.module.app.common.database.conversion.ConversionFactory;
import com.wrs.project.module.app.common.database.dao.ArticleDao;
import com.wrs.project.module.app.common.database.entity.Article;@androidx.room.Database(entities = { Article.class}, // 声明需要创建表的实体version = 2, // 数据库版本号exportSchema = true  // 表结构是否需要导出
)
@TypeConverters({ConversionFactory.class}) // 属性类型转换,这里值转换了Date类
public abstract class Database extends RoomDatabase {public abstract ArticleDao articleDao(); // 声明每个entity的dao类private static Database sInstance; // 创建访问数据库比较耗资源,生成单例方便访问public static Database getInstance(final Context context) {if (sInstance == null) {synchronized (Database.class) {if (sInstance == null) {sInstance = create(context.getApplicationContext());}}}return sInstance;}private static Database create(final Context context) {return Room.databaseBuilder(context,Database.class,"phonesign_db").addMigrations(MIGRATION_1_2) // 构建版本升级时表结构的变化.allowMainThreadQueries().build();}private static Migration MIGRATION_1_2 = new Migration(1,2) {@Overridepublic void migrate(SupportSQLiteDatabase database) {database.execSQL("ALTER TABLE Article "+ " ADD COLUMN token TEXT");database.execSQL("ALTER TABLE Article "+ " ADD COLUMN comments INTEGER NOT NULL DEFAULT 0");}};
}

5. 测试

package com.wrs.project.module.app.common;import android.content.Context;
import android.util.Log;import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;import com.wrs.project.module.app.common.database.DBService;
import com.wrs.project.module.app.common.database.entity.Article;import org.junit.Test;
import org.junit.runner.RunWith;import java.util.ArrayList;
import java.util.Date;
import java.util.List;import static org.junit.Assert.assertEquals;@RunWith(AndroidJUnit4.class)
public class DatabaseInstrumentedTest {@Testpublic void useAppContext() {// Context of the app under test.Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();AppMgr.context = appContext;AppMgr.debug = true;List<Article> list = new ArrayList<>();for (int i = 0; i < 6; i++) {Article entity = new Article();entity.setTitle("title" + i);entity.setDate(new Date());list.add(entity);}DBService.insertAll(list);List<Article> resultList = DBService.findAll();if (null != resultList && resultList.size() > 0) {for (int i = 0; i < resultList.size(); i++) {Article entity = resultList.get(i);Log.e("article", entity.getTitle());}}List<Article>  entityList = DBService.findByTitle("title5");Log.e("article", entityList.toString());}
}

项目源码:https://codechina.csdn.net/android1/projectbasic
上篇:无 目录 下篇:android专题-蓝牙扫描、连接、读写

如果觉得可以就点个

android专题-数据库Room相关推荐

  1. android专题-蓝牙扫描、连接、读写

    android专题-蓝牙扫描.连接.读写 概念 外围设备 可以被其他蓝牙设备连接的外部蓝牙设备,不断广播自身的蓝牙名及其数据,如小米手环.共享单车.蓝牙体重秤 中央设备 可以搜索并连接周边的外围设备, ...

  2. Android专题-常用第三方框架

    Android专题-常用第三方框架 HTTP网络请求 带*号的是个人推荐比较好用的 HTTP网络请求 okhttp * :https://github.com/square/okhttp retrof ...

  3. android与mysql数据库同步_android开发 如何通过web服务器访问MYSQL数据库并且使其数据同步到android SQLite数据库?...

    通过web服务器访问MYSQL数据库有以下几个过程: 1.在MySql下创建自己的数据库和自己的表单 2.连接数据库. 3.访问数据库 1.创建web工程 (服务器端) 在Myeclipse下新建一个 ...

  4. android 建数据库 SQLite 存储sd 卡或者内存

    android 创建数据库调用SQLiteOpenHelper,一般不直接操作SQLiteDatabase . 是通过SQLiteOpenHelper来获取 public class DBOpenHe ...

  5. android 数据库表格数据库数据库中,Android SQLite数据库中的表详解

    Android SQLite数据库 前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的 ...

  6. android面向数据库的的编程工具-OrmLite

    数据库操作框架OrmLite ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具. 对象关系映射(Object Rel ...

  7. 使用浏览器查看Android SQLite数据库-Android Debug Database用法

    本文转载自[http://blog.csdn.net/o279642707/article/details/68946230] 前言 Android客户端查看sqlite数据库是很繁琐的事情,需要DD ...

  8. 利用SQLChiper对Android SQLite数据库加密

    利用SQLChiper对Android SQLite数据库加密 前言: 上篇文章讲了Android studio+SQLCipher加密SQLite数据库的几个坑,跳过这几个坑,那么SQLCipher ...

  9. android SQLite数据库的使用

    今天,简单讲讲android如何使用SQLite数据库.  最近,自己在做一个功能时又用到了SQLite数据库,发现自己还是掌握的不很全面.其实之前的app里面也一直用到了数据库,但是自己没有花时 ...

最新文章

  1. Unity从零开始构建能力体系 Unity Ability System
  2. ElasticSearch大批量数据入库
  3. python -m uiautomator2 init 报错_Python|实现属于自己的数据类型
  4. Python-Day3-数据类型
  5. Android SDK更新的问题
  6. RTEMS移植USB无线网卡的设想
  7. 阿里巴巴如何改善开发人员在 K8s 上的体验?
  8. unilever news
  9. cmd上写的java简单代码_用cmd编辑一个超级简单的小游戏,求代码
  10. 【python】python第二周作业
  11. id nfc模拟_手机NFC也可以刷ID卡门禁?无聊测试居然成功了
  12. oracle 取整点的数据,Oracle SQL语句操作数字:取整、四舍五入及格式化
  13. C语言之文件读写探究(三):fputs、fgets、feof(一次读写一行字符(文本操作))
  14. Docker学习2-虚拟化
  15. 抖音等多款软件涉代码抄袭,字节跳动被诉赔22.74亿元;iPhone12系统更新后性能退回3年前;Qt 6.1正式发布|极客头条...
  16. HttpClient的使用方法
  17. 终端用sublime打开文件的方法
  18. linux r语言 安装包下载,R语言安装程序包(示例代码)
  19. mysql两种事务管理器_MyBatis事务管理的两种方式
  20. Android版的股票行情K线图开发

热门文章

  1. hive lock命令的使用
  2. kettle组件-输出
  3. Servlet的基本架构
  4. 检测jQuery.js是否已加载的判断代码
  5. Traveller项目介绍
  6. Entity Framework学习三:查询、插入、更新和删除操作
  7. 分享.NET开发中经常使用到的代码片段 完全从实际项目中提取出来,也可被反反复复的重复借用...
  8. SQL注入漏洞全接触--入门篇
  9. 尺度不变特征变换匹配算法详解
  10. DataGrid中自带的分页功能的使用