相关文章推荐
大方的皮蛋  ·  Delphi: how to set ...·  2 年前    · 
威武的长颈鹿  ·  导入和导出 - Azure ...·  2 年前    · 

不管是使用开源的数据库还是原生自带的,学会一些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;
idfirstNamelastNameage
1xm23
2df55
3er40
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 / ORSELECT column_name(s)
FROM table_name
WHERE condition
AND|OR condition
ALTER TABLEALTER 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
BETWEENSELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
CREATE DATABASECREATE DATABASE database_name
CREATE TABLECREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name2 data_type,
...
)
CREATE INDEXCREATE INDEX index_name
ON table_name (column_name)
or
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
CREATE VIEWCREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
DELETEDELETE 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 DATABASEDROP DATABASE database_name
DROP INDEXDROP 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 TABLEDROP TABLE table_name
GROUP BYSELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVINGSELECT 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
INSELECT column_name(s)
FROM table_name
WHERE column_name
IN (value1,value2,..)
INSERT INTOINSERT INTO table_name
VALUES (value1, value2, value3,....)
or
INSERT INTO table_name
(column1, column2, column3,...)
VALUES (value1, value2, value3,....)
INNER JOINSELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
LEFT JOINSELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
RIGHT JOINSELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
FULL JOINSELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
LIKESELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
ORDER BYSELECT column_name(s)
FROM table_name
ORDER BY column_name [ASC|DESC]
SELECTSELECT column_name(s)
FROM table_name
SELECT *SELECT *
FROM table_name
SELECT DISTINCTSELECT DISTINCT column_name(s)
FROM table_name
SELECT INTOSELECT *
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 TOPSELECT TOP number|percent column_name(s)
FROM table_name
TRUNCATE TABLETRUNCATE TABLE table_name
UNIONSELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
UNION ALLSELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
UPDATEUPDATE table_name
SET column1=value, column2=value,...
WHERE some_column=some_value
WHERESELECT 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数据库的增删改查功能。RoomAndroid 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 在编译时将数据库的架构信