【问题标题】:What is the use of '_id' in ContentUris.withAppendedIdContentUris.withAppendedId 中的“_id”有什么用
【发布时间】:2014-04-24 07:43:28
【问题描述】:

我一直在努力更新 SQlite 数据库表中的仅 1 行。

虽然我在 ContentUris.withAppendedId Uri 中提供了我想要更新的行的 _id 值,但我仍然需要在更新语句的“WHERE”部分中检查记录的 id 是否相同。

当我将更新语句的“WHERE”部分保留为“null”时,更新语句会尝试更新表的所有行,而不是仅更新具有所提供 id 的行。

【问题讨论】:

    标签: android sqlite uri android-contentprovider


    【解决方案1】:

    URI 定义了一个资源。他们没有定义可以对该资源进行哪些操作。

    关于ContentProvider(因为您已将其包含在问题的标签中),您需要考虑带有ContentProvider 的应用程序和希望访问或修改其数据的应用程序可能不会是同一个应用程序。如果您正在实现 ContentProvider,则需要识别您提到的那种 URI 并相应地调整 WHERE 子句,假设您支持对该资源的操作。

    另一个用途是插入操作,其中返回的典型内容是刚刚插入的项目的 URI。例如。在 URI content://authority/directory 上成功插入会返回类似 content://authority/directory/_id 的内容,其中 _id 是新插入行的 ID。

    【讨论】:

    • 好的,很清楚。但是 ContentUris.withAppendedID 只允许访问 1 行,即具有给定 ID 的行。那么,为什么我必须在更新语句的选择部分进行检查呢?
    • Android 不知道这个 URI 指向什么资源,它只知道它是一个资源。它不知道你在这个资源上支持什么操作。它不知道末尾的数字指的是行 ID——它可能有其他含义。 URI 可以采用多种形式并具有许多路径段,因此 Android 不做任何假设,开发人员有责任实现所需的行为。
    • 根据 ContentUris 引用 (developer.android.com/reference/android/content/…),id 是“前面路径部分标识的数据子集中单行的唯一数字标识符”。换句话说,它直接指向必须更新的一条记录,在我看来,额外的“WHERE”检查是多余的。如果 Android 不知道末尾的数字指的是行 ID,那么 'withAppendedId' 方法将完全没用。
    • 阅读其余部分:“大多数提供者识别包含 id 部分的内容 URI 并对其进行特殊处理。包含名为 _ID 的列的表通常期望 id 部分是该列的特定值。”如果我不在我的表中使用 _ID 怎么办? Android 对您的表或数据一无所知——它甚至不知道您是否在使用 表和 SQLite。您可以很好地读取 URI 并使用一些完全不同的机制来读取/修改某些数据。没有假设,因为假设可能而且经常是错误的。
    • 你给了我很多思考! :)
    猜你喜欢
    • 2013-11-25
    • 2013-03-21
    • 2017-01-30
    • 2020-06-19
    • 1970-01-01
    • 2019-12-16
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多