Android 对于执行的每个数据库操作的类型,活动或片段必须有单独的加载程序吗?

Android 对于执行的每个数据库操作的类型,活动或片段必须有单独的加载程序吗?,android,sqlite,android-loadermanager,android-cursorloader,asynctaskloader,Android,Sqlite,Android Loadermanager,Android Cursorloader,Asynctaskloader,似乎Google推荐的片段或活动与sqlite数据库交互的方式(使用android支持库)是通过一个加载程序来扩展AsyncTaskLoader,其工作方式类似于CursorLoader对ContentProviders的工作方式 单个活动或片段可以多种方式与数据库交互,更新、删除和查询一个或多个表中的数据。但是,由于加载程序只有一个执行数据库操作的位置(即在loadInBackground()),开发人员是否需要为每种类型的交互编写单独的加载程序,特别是因为这似乎是在loadInBackgro

似乎Google推荐的片段或活动与sqlite数据库交互的方式(使用android支持库)是通过一个加载程序来扩展AsyncTaskLoader,其工作方式类似于CursorLoader对ContentProviders的工作方式

单个活动或片段可以多种方式与数据库交互,更新、删除和查询一个或多个表中的数据。但是,由于加载程序只有一个执行数据库操作的位置(即在
loadInBackground()
),开发人员是否需要为每种类型的交互编写单独的加载程序,特别是因为这似乎是在
loadInBackground()中参数化行为的唯一方法
是通过将参数通过
args
参数传递给加载程序的构造函数,传递给
LoaderManager.initLoader()


非常感谢。

在应用程序中使用
游标加载程序
活动有两个关键好处。managedQuery():

  • 查询是在后台线程上为您处理的(这是基于
    AsyncTaskLoader构建的)
    ,因此大数据查询不会阻塞UI。这是文档建议您在使用普通的
    光标时为自己做的事情,但现在它是在后台完成的
  • CursorLoader
    自动更新。除了执行初始查询外,游标加载程序还向您请求的数据集注册一个
    ContentObserver
    ,并在数据集更改时对自身调用
    forceLoad()
    。这会导致您在数据更改时获得
    async
    回调,以更新视图
  • 每个加载器实例也通过单一的
    LoaderManager
    进行处理,因此您仍然不必直接管理游标,现在连接甚至可以在单个
    活动之外保持。LoaderManager.initLoader()
    LoaderManager.restartLoader()
    允许您重新连接已为查询设置的现有加载程序,在某些情况下,可以立即获取最新数据(如果可用)

    您的活动或片段现在可能会实现
    LoaderManager
    .Callback接口。调用
    initLoader()
    将产生onCreateLoader()方法,您将在其中构造查询和一个新的
    CursorLoader
    实例(如果需要)。每次有新数据可用时,都会触发
    onLoadFinished()
    方法,该方法将包含最新的光标,供您附加到视图或进行迭代

    此外,在
    LoaderManager
    类文档页面上有一个很好的例子,说明了所有这些功能的结合:


    希望有帮助

    在应用程序中使用
    CursorLoader
    超过
    Activity.managedQuery():

  • 查询是在后台线程上为您处理的(这是基于
    AsyncTaskLoader构建的)
    ,因此大数据查询不会阻塞UI。这是文档建议您在使用普通的
    光标时为自己做的事情,但现在它是在后台完成的
  • CursorLoader
    自动更新。除了执行初始查询外,游标加载程序还向您请求的数据集注册一个
    ContentObserver
    ,并在数据集更改时对自身调用
    forceLoad()
    。这会导致您在数据更改时获得
    async
    回调,以更新视图
  • 每个加载器实例也通过单一的
    LoaderManager
    进行处理,因此您仍然不必直接管理游标,现在连接甚至可以在单个
    活动之外保持。LoaderManager.initLoader()
    LoaderManager.restartLoader()
    允许您重新连接已为查询设置的现有加载程序,在某些情况下,可以立即获取最新数据(如果可用)

    您的活动或片段现在可能会实现
    LoaderManager
    .Callback接口。调用
    initLoader()
    将产生onCreateLoader()方法,您将在其中构造查询和一个新的
    CursorLoader
    实例(如果需要)。每次有新数据可用时,都会触发
    onLoadFinished()
    方法,该方法将包含最新的光标,供您附加到视图或进行迭代

    此外,在
    LoaderManager
    类文档页面上有一个很好的例子,说明了所有这些功能的结合:


    希望有帮助

    当不使用
    内容提供程序时,即当直接使用sqlite时,如果要执行的数据库操作集返回
    光标,则使用
    AsyncTaskLoader
    。该集合可以包括任何类型的操作-更新、查询、删除、插入。这些操作应在
    AsyncTaskLoader.loadInBackground()
    中执行


    如果数据库操作集未导致返回
    光标
    ,请使用
    异步任务
    。在这种情况下,当不使用
    ContentProvider
    时,操作应在
    AsyncTask.doInBackground()
    中执行,即当直接使用sqlite时,如果要执行的数据库操作集返回
    光标,则使用
    AsyncTaskLoader
    。该集合可以包括任何类型的操作-更新、查询、删除、插入。这些操作应在
    AsyncTaskLoader.loadInBackground()
    中执行


    如果数据库操作集未导致返回
    光标
    ,请使用
    异步任务
    。在这种情况下,操作应该在
    AsyncTask.doInBackground()

    中执行。根据前面的回答,我不确定这是否就是您要问的。但是,是的,你必须做出一个明智的决定