当前位置: 首页 > 文档资料 > DBFlow 中文文档 >

事物处理

优质
小牛编辑
152浏览
2023-12-01

事务处理利用了DBTransactionQueue。这个队列是基于Volley的VolleyRequestQueue通过使用PriorityBlockingQueue。此队列将使用下列顺序按优先执行我们的数据库事务(最高到最低):

  1. UI:保留将显示在用户界面的数据的操作。
  2. 2 HIGH:保留,这将影响用户任务互动的操作。

  3. 一定时间内(不一定是马上)在UI在某一时刻的数据显示。

  4. NORMALTransaction的默认优先级,增加事务的时候,应用程序并不需要访问。

  5. LOW:低优先级,对于非基本任务保留。

DBTransactionInfo:持有在DBTransactionQueue上如何处理BaseTransaction的信息。它包含一个名称和优先级。这个名字纯粹是为了在运行时和执行时识别它的时候调试。优先级优先于上一段提及的优先级。

对于先进的用法,TableTransactionManager 或通过扩展TransactionManager,您可以创建并指定自己的DBTransactionQueue。你就可以用这个类来管理你的事务了。

处理保存一组数据,而又不阻塞ui线程,以前我们是这样做的:

我们使用以下几行代码代替而之,使得方法实用,而且又在线程运行:

  1. TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(models)));

ProcessModelInfo:描述了如何用一个事务来保存信息,例如DBTransactionInfo,table,一组models,和一个TransactionListener为事务。注意:该类的建立是为了大幅度简化方法数的TransactionManager上。

对于跨上百个Model的大行动中,首选的方法是在DBTransactionQueue运行它。这将在同一线程上进行数据库操作,以减轻同步锁定和UI线程阻塞。

对于大规模的save()操作,首选的方法是通过 DBBatchSaveQueue。这将运行一个批处理DBTransaction 一旦队列满(默认为50 models,并且可以修改)在同一时间上的所有模型中。如果要保存少量的items,或者需要他们准确地保存,最好的选择是使用常规的保存事务。

  1. ProcessModelInfo<SomeModel> processModelInfo = ProcessModelInfo<SomeModel>.withModels(models)
  2. .info(myInfo);
  3. TransactionManager.getInstance().saveOnSaveQueue(models);
  4. // or directly to the queue
  5. TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(processModelInfo));
  6. // Updating only updates on the ``DBTransactionQueue``
  7. TransactionManager.getInstance().addTransaction(new UpdateModelListTransaction(processModelInfo));
  8. TransactionManager.getInstance().addTransaction(new DeleteModelListTransaction(processModelInfo));

SelectListTransactionSelectSingleModelTransactionDBTransactionQueue中进行select,它完成时TransactionListener将在UI线程调用。一个正常的SQLite.select()将当前线程上完成。虽然这是简单的数据库操作,这要好得多,在DBTransactionQueue执行这些操作使其他操作不会导致主线程的“锁”。

这个库可以很容易添加自定义的事务。将它们添加到事务管理方式:

  1. TransactionManager.getInstance().addTransaction(myTransaction);

有几个方法可以创建你一个你想要的特定事务:

  • 扩展 BaseTransaction将要求你在 onExecute()进行一些操作.

    1. BaseTransaction<TestModel1> testModel1BaseTransaction = new BaseTransaction<TestModel1>() {
    2. // do something and return an object
    3. return testModel;
    4. }
    5. };
  • ProcessModelTransaction发在在一个model内,使您能够定义如何在DBTransactionQueue处理在每一款model。

    1. public class CustomProcessModelTransaction<ModelClass extends Model> extends ProcessModelTransaction<ModelClass> {
    2. public CustomProcessModelTransaction(ProcessModelInfo<ModelClass> modelInfo) {
    3. super(modelInfo);
    4. }
    5. @Override
    6. public void processModel(ModelClass model) {
    7. // process model class here!
    8. }
    9. }
  1. // any Where, From, Insert, Set, and StringQuery all are valid parameters
  2. TransactionManager.getInstance().addTransaction(new QueryTransaction(DBTransactionInfo.create(),