检索 SQL 房间 Android 生成的查询

Retrieve SQL queries generated with Room Android

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

吾道class:

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

我想检索 @Query 注释的内容。

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

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

编辑:

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

你可以通过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,因为它是特定于房间的,而且哈希是从代码生成的,我相信,因此对所做的更改很敏感。

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

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