不管是使用开源的数据库还是原生自带的,学会一些SQL命令是非常有必要的.
文章接下来是自己在使用Room的过程中使用的sql语句.关于Room的使用说明见官网
https://developer.android.com/training/data-storage/room
在操作数据库以及数据库升级的过程中,会频繁的用到sql语句,下面来分别说明
1 使用 Room DAO 访问数据
@Entity
public class User {
@PrimaryKey
public int id;
public String firstName;
public String lastName;
public int age;
| id | firstName | lastName | age |
| 1 | xm | 噫 | 23 |
| 2 | df | 兄 | 55 |
| 3 | er | 弟 | 40 |
public interface MyDao {
@Query("SELECT * FROM user")
public User[] loadAllUsers();
public interface MyDao {
@Query("SELECT * FROM user WHERE age BETWEEN :minAge AND :maxAge")
public User[] loadAllUsersBetweenAges(int minAge, int maxAge);
@Query("SELECT * FROM user WHERE first_name LIKE :search " +
"OR last_name LIKE :search")
public List<User> findUserWithName(String search);
注意: 查询语句的时候,可以选择性的返回列.例如如下代码.
public interface MyDao {
@Query("SELECT first_name, last_name FROM user")
public List<NameTuple> loadFullName();
Room 知道该查询会返回 first_name 和 last_name 列的值,并且这些值会映射到 NameTuple 类的字段中。因此,Room 可以生成正确的代码。如果查询返回的列过多,或者返回 NameTuple 类中不存在的列,则 Room 会显示一条警告。
注意@Delete不能添加sql语句,所以要用@Query来支持条件删除
@Query("DELETE FROM user WHERE age=:age")
int deleteByAge(int age);
2 数据库升级
public static AdvertDatabase getInstance(Context context) {
if (sInstance == null) {
synchronized (AdvertDatabase.class) {
if (sInstance == null) {
sInstance = Room.databaseBuilder(context.getApplicationContext(),
AdvertDatabase.class, "user.db")
.allowMainThreadQueries()
.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6,MIGRATION_6_7)
.addCallback(CALLBACK)
.fallbackToDestructiveMigration()
.build();
return sInstance;
@VisibleForTesting
static final Migration MIGRATION_3_4 = new Migration(3, 4) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
Log.i(TAG, "migrate 3==>4: ");
database.execSQL("ALTER TABLE `User` ADD COLUMN weight INTEGER NOT NULL DEFAULT 0 ");
database.execSQL("DROP INDEX IF EXISTS `id`");
database.execSQL("CREATE UNIQUE INDEX `user_id` ON `User` (`id`)");
@VisibleForTesting
static final Migration MIGRATION_5_6 = new Migration(5, 6) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
Log.i(TAG, "migrate 5==>6: ");
database.execSQL("DROP TABLE IF EXISTS `User`");
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,`age` INTEGER ,`lastName` TEXT NOT NULL,`firstName` TEXT NOT NULL)");
database.execSQL("ALTER TABLE `AdvertBean` DROP COLUMN weight INTEGER ");
以下是详细说明
DROP TABLE 语句用于删除表。
DROP TABLE table_name
DROP INDEX 语句
DROP INDEX 语句用于删除表中的索引
CREATE TABLE 语句用于创建数据库中的表。
表由行和列组成,每个表都必须有个表名。
创建表的时候注意数据类型,目前android支持的数据类型包括:
见参考: https://www.runoob.com/sqlite/sqlite-data-types.html
SQL ALTER TABLE 语法
如需在表中添加列,请使用下面的语法:
ALTER TABLE table_name
ADD column_name datatype
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
ALTER TABLE table_name
DROP COLUMN column_name
要改变表中列的数据类型,请使用下面的语法:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
常用SQL语句参考
| SQL 语句 | 语法 |
| AND / OR | SELECT column_name(s) |
| FROM table_name |
| WHERE condition |
| AND|OR condition |
| ALTER TABLE | ALTER TABLE table_name |
| ADD column_name datatype |
| or |
| ALTER TABLE table_name |
| DROP COLUMN column_name |
| AS (alias) | SELECT column_name AS column_alias |
| FROM table_name |
| or |
| SELECT column_name |
| FROM table_name AS table_alias |
| BETWEEN | SELECT column_name(s) |
| FROM table_name |
| WHERE column_name |
| BETWEEN value1 AND value2 |
| CREATE DATABASE | CREATE DATABASE database_name |
| CREATE TABLE | CREATE TABLE table_name |
| ( |
| column_name1 data_type, |
| column_name2 data_type, |
| column_name2 data_type, |
| ... |
| ) |
| CREATE INDEX | CREATE INDEX index_name |
| ON table_name (column_name) |
| or |
| CREATE UNIQUE INDEX index_name |
| ON table_name (column_name) |
| CREATE VIEW | CREATE VIEW view_name AS |
| SELECT column_name(s) |
| FROM table_name |
| WHERE condition |
| DELETE | DELETE FROM table_name |
| WHERE some_column=some_value |
| or |
| DELETE FROM table_name |
| (Note: Deletes the entire table!!) |
| DELETE * FROM table_name |
| (Note: Deletes the entire table!!) |
| DROP DATABASE | DROP DATABASE database_name |
| DROP INDEX | DROP INDEX table_name.index_name (SQL Server) |
| DROP INDEX index_name ON table_name (MS Access) |
| DROP INDEX index_name (DB2/Oracle) |
| ALTER TABLE table_name |
| DROP INDEX index_name (MySQL) |
| DROP TABLE | DROP TABLE table_name |
| GROUP BY | SELECT column_name, aggregate_function(column_name) |
| FROM table_name |
| WHERE column_name operator value |
| GROUP BY column_name |
| HAVING | SELECT column_name, aggregate_function(column_name) |
| FROM table_name |
| WHERE column_name operator value |
| GROUP BY column_name |
| HAVING aggregate_function(column_name) operator value |
| IN | SELECT column_name(s) |
| FROM table_name |
| WHERE column_name |
| IN (value1,value2,..) |
| INSERT INTO | INSERT INTO table_name |
| VALUES (value1, value2, value3,....) |
| or |
| INSERT INTO table_name |
| (column1, column2, column3,...) |
| VALUES (value1, value2, value3,....) |
| INNER JOIN | SELECT column_name(s) |
| FROM table_name1 |
| INNER JOIN table_name2 |
| ON table_name1.column_name=table_name2.column_name |
| LEFT JOIN | SELECT column_name(s) |
| FROM table_name1 |
| LEFT JOIN table_name2 |
| ON table_name1.column_name=table_name2.column_name |
| RIGHT JOIN | SELECT column_name(s) |
| FROM table_name1 |
| RIGHT JOIN table_name2 |
| ON table_name1.column_name=table_name2.column_name |
| FULL JOIN | SELECT column_name(s) |
| FROM table_name1 |
| FULL JOIN table_name2 |
| ON table_name1.column_name=table_name2.column_name |
| LIKE | SELECT column_name(s) |
| FROM table_name |
| WHERE column_name LIKE pattern |
| ORDER BY | SELECT column_name(s) |
| FROM table_name |
| ORDER BY column_name [ASC|DESC] |
| SELECT | SELECT column_name(s) |
| FROM table_name |
| SELECT * | SELECT * |
| FROM table_name |
| SELECT DISTINCT | SELECT DISTINCT column_name(s) |
| FROM table_name |
| SELECT INTO | SELECT * |
| INTO new_table_name [IN externaldatabase] |
| FROM old_table_name |
| or |
| SELECT column_name(s) |
| INTO new_table_name [IN externaldatabase] |
| FROM old_table_name |
| SELECT TOP | SELECT TOP number|percent column_name(s) |
| FROM table_name |
| TRUNCATE TABLE | TRUNCATE TABLE table_name |
| UNION | SELECT column_name(s) FROM table_name1 |
| UNION |
| SELECT column_name(s) FROM table_name2 |
| UNION ALL | SELECT column_name(s) FROM table_name1 |
| UNION ALL |
| SELECT column_name(s) FROM table_name2 |
| UPDATE | UPDATE table_name |
| SET column1=value, column2=value,... |
| WHERE some_column=some_value |
| WHERE | SELECT column_name(s) |
| FROM table_name |
| WHERE column_name operator value |
SQL 函数
- AVG() - 返回平均值
- COUNT() - 返回行数
- FIRST() - 返回第一个记录的值
- LAST() - 返回最后一个记录的值
- MAX() - 返回最大值
- MIN() - 返回最小值
- SUM() - 返回总和
https://www.runoob.com/sql/sql-tutorial.html
https://developer.android.com/training/data-storage/room
Room是一个专门用于操作SQLite数据库的技术,它是对传统的SQLite数据库操作的抽象封装,使用Room可以更加简便的实现SQLite数据库的增删改查功能。Room是Android Jetpack中的一部分,并且Android官方强烈建议,我们使用Room来操作SQLite数据库,而不是直接通过SQLite API。注意:使用Room需要引入相应的依赖。传统的SQLite的操作大致如下所示:第一步:创建自定义的数据库类,继承自SQLiteOpenHelper工具类,重写其中方法,创建数据表。
如果不用Room提供的注解方式去查询sql,根据需求要写冗长复杂的查询语句(比如查询的条件数量不是固定的,语句不定长),注解的方式去写实现不了需求,那么就要用Room动态拼写原生sql语句去查询:
使用SimpleSQLiteQuery,将原生的sql字符串传进去就行:
* home_条件検索
* @return 検索結果
public Single<List<RidingLogRoomEntity>> searchCon
什么是AIDL:
AIDL(Android Interface Definition Language),翻译成中文就是安卓接口定义语言的意思,是用于定义服务端和客户端通信接口的一种描述语言。其主要作用是IPC(Android进程间通讯),简单的来说就是AIDL可以让一个APP使用另外一个APP的Service,使得两个或者多个APP之间可以信息交互,使得多个APP之间只需要使用一套代码,这样对于同一个功能就不用在多个APP中都写一遍逻辑了,减少了重复代码。
AIDL的语法十分简单,与Java语言基本保持一致,需要记住的规则有以下几点:
AIDL文件以 .aidl 为后缀名
AIDL支持
文章目录一. 简介与导入二 . 应用1. 利用注解entity定义实体类2. 定义Dao,用于操作数据,进行增删改查3. 定义database4. 数据库的升级与降级5. 表关联三. 其他可能会用的一点技巧TypeConverterEmbeddedrxjava2
一. 简介与导入
Andorid官方中推荐Room代替SQlite,所以新的项目中直接舍弃了以前用的第三那方框架greenDao
Room由三部分组成,并且用三个注解标注:
Entity: 这个注解表示的是实体类,代表的是数据库中的表,每一个实体类
使用 Room 库存储应用数据时,通过定义数据访问对象(DAOs)与存储的数据进行交互。每一个 DAO 包含用来访问应用数据库的抽象方法,在编译时, Room 会自动生成并实现在 DAO 中定义的访问方法
另外,本文本还介绍了 DAO 异步查询的相关内容,为了防止数据查询操作阻断 UI,造成 UI 卡顿,Room 不允许在 UI 主线程中访问数据库。这就意味着开发者必须将 DAO 中的查询定义成异步的。Room 库包含与多阿哥不同的框架进行集成,提供异步查询支持。
select * from table where .... order by XX desc limit 0,10;
2.根据 时间日期 查询 :
注意时间格式必须是 2016-02-02
startTime="2016-02-02";
endTime="2016-03-04";
数据库中:
birthdayDate 生日列名
//room数据库
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - RxJava support for Room
implementat
Room数据库在升级时最麻烦的地方在于要自己写SQL语句,如果一个对象里面的属性很多的情况下自己写不管是语法上还是CV操作上都容易出现错误。但是Room又是谷歌官方推荐的数据库框架,并且也提供了很多方便的地方,例如:使用 Kotlin 协程进行异步查询;使用流进行响应式查询等。直接对接协程或者Flow,让我们舍不得放弃它。
那么使用Room数据库升级自动生成SQL语句的方法暂时找到两种:
导出数据库架构文件
在官方文档中迁移数据库->导出架构章节下有描述如何使用Room 在编译时将数据库的架构信