欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 数据库之 Room(五)

程序员文章站 2024-03-17 13:47:16
...

Android 数据库之 Room(五)

一、简介

Room 是 Google 推出的数据库框架。该持久型类库在SQLite的基础上提供了一个抽象层,允许流畅的访问SQLite数据库,全面强大的直接SQLite。

  • SQL 查询在编译期就会验证
  • 较少的模板代码
  • 支持 LiveData 集成

二、集成

  • 在项目级别的 build.gradle 中:
buildscript {
    repositories {
        maven {
            url "https://maven.google.com"
        }
        // 或 google()
    }
}

allprojects {
    repositories {
        maven {
            url "https://maven.google.com"
        }
        // 或 google()
    }
}
  • 在模块级别(如 app 模块)的 build.gradle 中:
apply plugin: 'com.android.application'
// 或者 apply plugin: 'com.android.library'

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                // room的数据库概要、记录
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }
}

dependencies {
    compile 'androidx.room:room-runtime:2.0.0'
    annotationProcessor 'androidx.room:room-compiler:2.0.0'
}

三、架构分析

Room 主要有3个部分:

  1. Database : 包含数据库持有者,并作为应用程序持久关系数据的基础连接的主要访问点。
  2. DAO : 数据库访问对象,实现具体的增删改查。
  3. Entity : 具体的bean实体,会与数据库表column进行映射。

Android 数据库之 Room(五)

引入代码:

  • 引入 Database 类:
@Database(entities = {SimpleEntity.class, SimpleIndexedEntity.class},
        version = 1, exportSchema = false)
public abstract class NormalDatabase extends RoomDatabase {

    public abstract SimpleEntityDao getSimpleEntityDao();

    public abstract SimpleIndexedEntityDao getSimpleIndexedEntityDao();
}
  • 引入 DAO 类:
@Dao
public interface SimpleEntityDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertMultiObjects(List<SimpleEntity> list);

    @Delete
    void deleteMultiObjects(List<SimpleEntity> list);

    @Update
    void updateMultiObjects(List<SimpleEntity> list);

    @Transaction
    @Query("SELECT * FROM simple_entity WHERE simpleInt = :simpleInt")
    List<SimpleEntity> queryBySimpleInt(int simpleInt);
}
  • 引入 Java Bean 类:
@Entity(tableName = "simple_entity")
public class SimpleEntity {

    @PrimaryKey(autoGenerate = true)
    long _id;
    boolean simpleBoolean;
    byte simpleByte;
    short simpleShort;
    int simpleInt;
    long simpleLong;
    float simpleFloat;
    double simpleDouble;

    String simpleString;
    byte[] simpleByteArray;
}

四、封装Room示例

Android 数据库之 Room(五)

五、示例代码

public class RoomUtils {

    private static Map<String, BaseDao> daoManagers;

    @SuppressLint("StaticFieldLeak")
    private static Context context;
    
    public static void init(Context context) {
    	RoomUtils.context = context.getApplicationContext();
    	if (daoManagers == null) {
        	daoManagers = new ConcurrentHashMap<>();
    	}
	}
    
    public static SimpleEntityManager getSimpleEntityManager() {
        SimpleEntityManager manager = (SimpleEntityManager) daoManagers.get(SIMPLE_ENTITY);
        if (null == manager) {
            manager = new SimpleEntityManager(context);
            daoManagers.put(SIMPLE_ENTITY, manager);
        }
        return manager;
    }
    
    public static void closeAllDataBase() {
        if (daoManagers != null && !daoManagers.isEmpty()) {
            for (BaseDao baseDao : daoManagers.values()) {
                baseDao.closeDataBase();
            }
            daoManagers = null;
        }
    }
}
public class SimpleEntityManager extends BaseDao<SimpleEntity> implements SimpleEntityDao {
    
    private SimpleEntityDao mDao;

    public SimpleEntityManager(Context context) {
        super(context);
        mDao = mDatabase.getSimpleEntityDao();
    }
    
    // 增、删、改、查
}
@Dao
public interface SimpleEntityDao {
	// 增
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertMultiObjects(List<SimpleEntity> list);
}
@Dao
public interface SimpleEntityDao {
	// 删
    @Delete
    void deleteMultiObjects(List<SimpleEntity> list);
}
@Dao
public interface SimpleEntityDao {
	// 改
    @Update
    void updateMultiObjects(List<SimpleEntity> list);
}
@Dao
public interface SimpleEntityDao {
	// 查
    @Query("SELECT * FROM simple_entity WHERE _id = :id LIMIT 1")
    SimpleEntity queryById(long id);
}

六、使用测试

注:可能因为具体测试机器不同,测试结果会有波动。下面的测试结果是用HuaWei Mate10测试的。

Android 数据库之 Room(五)

Android 数据库之 Room(五)