繁体   English   中英

如何在Room数据库中进行事务操作删除部分表 android

[英]How to perform transaction operation in Room database to delete some tables android

我不熟悉房间数据库。 我想在单击按钮时清除某些表中的数据。 我在 IOS 中有类似的代码,但我不确定必须在哪里编写此方法并调用此 delete function 以及如何访问表。 任何人都可以在 android 中帮助我解决这个问题。

IOS 代码:

class ApplicationResetManager: NSObject {
    
    static let shared: ApplicationResetManager = ApplicationResetManager()
    var cloSuccess:((_ isSuccessfull: Bool)->Void)?
    
    func clearAllData(completion: (Bool) -> Void) {
        let isSyncGoingOn = ApplicationManager.shared.isSyncGoingOn
        if let currentUser = ApplicationManager.shared.currentUser, currentUser.id! > 0, isSyncGoingOn == false {
            let dbQueue = DatabaseManager.shared.dbQueue!
            do {
                // 4. Access the database
                try dbQueue.inTransaction { db in
                    do {
                        try UserLocations.deleteAll(db)
                        try LineLayoutEquipment.deleteAll(db)
                        try LineLayout.deleteAll(db)
                        try Survey.deleteAll(db)
                        try HealthCheck.deleteAll(db)
                        try HealthCheckData.deleteAll(db)
                        try ActionItem.deleteAll(db)
                        try Equipments.deleteAll(db)
                        try EquipmentIndustry.deleteAll(db)
                        try Comments.deleteAll(db)
                        try PlantAreas.deleteAll(db)
                        try PlantAreasIndustrys.deleteAll(db)
                        try Applications.deleteAll(db)
                        try ApplicationsIndustrys.deleteAll(db)
                        try SurveyLineLevel.deleteAll(db)
                        try HealthCheckLineLevel.deleteAll(db)
                        try ActionItemLineLevel.deleteAll(db)
                        try ActionItemLineLvlComments.deleteAll(db)
                        
                        UserDefaults.standard.set([], forKey: arr_selected_company)
                        ApplicationManager.shared.currentUser.defaultCompanyId = nil
                        completion(true)
                        return .commit
                    } catch {
                        completion(false)
                        return .rollback
                    }
                }
            } catch {
                completion(false)
            }
        } else {
            print("Sync is already in progress")
        }
    }
}

如果使用 Room 你会有

  1. @Entity注释类(表),

  2. 每个数据库(很可能只是第一个)注释为 class 的单个@Database :-

    1.通过entities参数描述数据库(实体列表(即表又名@Entity注释类))

    1. 提供用于获取@Dao注释的抽象方法(接口或抽象类)
  3. 一个或多个@Dao注释接口和/或抽象类

    1. 详细介绍便捷方法( @Delete 、@ @Query @Update @Insert

由于您似乎想在单个事务中做很多事情,因此您需要一个调用这些许多操作的方法。

接口不能有带函数的方法,因此您需要一个带注释的@Dao class。

实际上,do many things 方法有点小技巧。

您首先有一个@Transaction注释。 由于 room 似乎不考虑此注释,除非您使用注释之一(并且唯一可以定制的注释是@Query ),然后您告诉 Room 运行一个不执行任何操作的查询,即使用@Query("")

您定义方法的主体可以调用@Dao注释摘要 class 中的其他方法。

所以你的代码可能是这样的:-

@Dao
abstract class MyDoitAllStuffDao {
    @Query("DELETE FROM userLocations") /* no WHERE clauses = delete all rows. TO BE USED IN DO IT ALL METHOD*/
    int deleteAllUserLocations();

    @Query("DELETE FROM linelayoutequipment");
    int deleteAllLineLayoutEquipment();
    
    ....

    @Transaction
    @Query("") /* trick room into think it is doing something */
    void /* or some useful return type */ doLotsOfThingsInASingleTransaction() {
    .... if you want to do preparotory stuff
    int deleteAllUserLocations_count = deleteAllUserLocations();
    int deleteAllLineLayout_count = deleteAllLineLayoutEquipment();

    .... etc
   }
}

然后在你的代码中的某个地方你得到一个实例@Database abstract class 构建了 RoomDatabase 然后检索然后调用适当的方法( doLotsOfThinsInASingleTransaction )通过@Database注释抽象中的抽象方法获取相应的@Dao注释接口/类实例class。

这是一个示例(未运行但编译成功)

一些@Entity注释类(非常基本,因为它与表的复杂性/设计无关):-

@Entity
class UserLocations {
    @PrimaryKey Long id=null;
    String user_name;
}

@Entity
class LineLayoutEquipment {
    @PrimaryKey Long id=null;
    String lle_name;
}
  • 显然你的课程很可能会有所不同,那是不相关的

@Dao注释的抽象 class(而不是更典型的接口(抽象 class 由于带有主体的方法更灵活)):-

@Dao
abstract class MyDoitAllStuffDao {

    @Query("DELETE FROM userLocations")
    abstract void deleteAllUserLocations();
    @Query("DELETE FROM linelayoutequipment")
    abstract void deleteAllLineLayoutEquipment();

    @Transaction
    @Query("")
    void doLotsOfThingsInASingleTransaction() {
        deleteAllUserLocations();
        deleteAllLineLayoutEquipment();
    }
}
  • 我通常在@Database注释 class 之后编写这些代码,但在@Database注释 class 之前包含它更有意义,当完成时需要@Dao注释类

@Database注释摘要 class(单例):-

@Database(
        entities = {UserLocations.class,LineLayoutEquipment.class},
        exportSchema = false,
        version = 1
)
abstract class TheDatabase extends RoomDatabase {
    abstract MyDoitAllStuffDao getMyDoitAllStuffDao();

    private static TheDatabase INSTANCE;
    static TheDatabase getInstance(Context context) {
        if (INSTANCE==null) {
            return Room.databaseBuilder(context,TheDatabase.class,"the_database.db")
                    .build();
        }
        return INSTANCE;
    }
}

最后在活动代码中使用上面的内容,例如:-

public class MainActivity extends AppCompatActivity {
    TheDatabase db;
    MyDoitAllStuffDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = TheDatabase.getInstance(this);
        dao = db.getMyDoitAllStuffDao();
        dao.doLotsOfThingsInASingleTransaction();

    }
}

所以你需要做的就是确保你已经用 scope 为监听器实例化了 db 和 dao 并使用最后一行(如果遵循约定,则在主线程之外)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM