【问题标题】:Retrieve SQL queries generated with Room Android检索使用 Room Android 生成的 SQL 查询
【发布时间】:2020-01-04 01:58:28
【问题描述】:

如何检索Room Android生成的所有SQLqueries

我的道课:

@Dao
public interface MyDao {
    @Query("SELECT * FROM user WHERE age > :minAge")
    public User[] loadAllUsersOlderThan(int minAge);
}

我要检索@Query注解的内容。

我知道我可以使用注释处理器,但这不允许我检索用于创建数据库表的查询以及从@Insert@Update@Delete 生成的查询。

我想在 sqlite3 in Node.JS 的另一个应用程序中重复使用这些查询。

编辑:

我想以编程方式检索 queries 以防止将它们写入两次,一次用于 android 应用程序,一次用于Node.JS 应用程序。

【问题讨论】:

    标签: android android-room dao


    【解决方案1】:

    您可以通过生成的代码 yourDao(s) 获取所有查询,该代码带有 _implyour@DatabaseClass(s) 后缀与 _impl

    例如对于

    @Dao
    public interface CustomerDao {
    
        @Insert
        long insert(Customer customer);
    
        @Query("INSERT INTO Customer (firstname, lastName, dateAdded) VALUES(:firstName,:lastName,:dateAdded)")
        long insert(String firstName, String lastName, String dateAdded);
    
        @Query("SELECT * FROM customer WHERE firstName=:firstName AND lastName = :lastName")
        Customer getCustomerByName(String firstName, String lastName);
    
        @Query("SELECT * FROM customer")
        LiveData<List<Customer>> getAllCustomers();
    }
    

    那么 CustomerDao_Impl 是:-

    @SuppressWarnings({"unchecked", "deprecation"})
    public final class CustomerDao_Impl implements CustomerDao {
      private final RoomDatabase __db;
    
      private final EntityInsertionAdapter<Customer> __insertionAdapterOfCustomer;
    
      private final SharedSQLiteStatement __preparedStmtOfInsert;
    
      public CustomerDao_Impl(RoomDatabase __db) {
        this.__db = __db;
        this.__insertionAdapterOfCustomer = new EntityInsertionAdapter<Customer>(__db) {
          @Override
          public String createQuery() {
            return "INSERT OR ABORT INTO `Customer` (`id`,`firstName`,`lastName`,`dateAdded`) VALUES (?,?,?,?)";
          }
      ..........
    

    对于ShopDatabase

    @Database(entities = {Customer.class}, version = 1)
    //@TypeConverters({Converters.class})
    public abstract class ShopDatabase extends RoomDatabase {
        private static ShopDatabase instance;
        ..........
    

    那么 ShopDatabase_Impl 是:-

    @SuppressWarnings({"unchecked", "deprecation"})
    public final class ShopDatabase_Impl extends ShopDatabase {
      private volatile CustomerDao _customerDao;
    
      @Override
      protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration configuration) {
        final SupportSQLiteOpenHelper.Callback _openCallback = new RoomOpenHelper(configuration, new RoomOpenHelper.Delegate(1) {
          @Override
          public void createAllTables(SupportSQLiteDatabase _db) {
            _db.execSQL("CREATE TABLE IF NOT EXISTS `Customer` (`id` INTEGER, `firstName` TEXT, `lastName` TEXT, `dateAdded` TEXT, PRIMARY KEY(`id`))");
            _db.execSQL("CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)");
            _db.execSQL("INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '588832abfd9fd9c6aad8dcebe485e219')");
          }
    
          @Override
          public void dropAllTables(SupportSQLiteDatabase _db) {
            _db.execSQL("DROP TABLE IF EXISTS `Customer`");
            if (mCallbacks != null) {
              for (int _i = 0, _size = mCallbacks.size(); _i < _size; _i++) {
                mCallbacks.get(_i).onDestructiveMigration(_db);
              }
            }
          }
          ..........
    
    • 您可能不想要 room_master_table,因为它是特定于房间的,并且我相信哈希是从代码生成的,因此对所做的更改很敏感。

      • 其中........表示为简洁起见省略了代码

    【讨论】:

      【解决方案2】:

      如果其他人想要自动导出所有查询,我所做的不是在我的每个 DaoClassName_Impl 中手动获取它们,而是导出我的房间数据库模式,然后处理导出的 json 文件。如果您想在 android studio 中创建一个 java 模块以便于重用,我建议创建一个注解处理器(即使它不处理任何注解),它将在您每次构建项目时自动运行。

      【讨论】:

        猜你喜欢
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 2010-10-17
        • 1970-01-01
        • 2017-10-26
        • 2019-01-09
        相关资源
        最近更新 更多