代码之家  ›  专栏  ›  技术社区  ›  lucky1928

android M settings数据库查询错误,LIKE关键字

  •  0
  • lucky1928  · 技术社区  · 9 年前

    下面的代码在L版上运行良好,但在M版上不起作用。

    public void test() {
        ContentResolver resolver = getContentResolver();
        String[] proj = {
                Settings.System.NAME,
                Settings.System.VALUE};
        String sql = proj[1] + " LIKE 'content%'";
        Cursor cursor = resolver.query(Settings.System.CONTENT_URI,
                proj,sql,null,null);
        while(cursor.moveToNext()) {
            String key = cursor.getString(cursor.getColumnIndex(proj[0]));
            String value = cursor.getString(cursor.getColumnIndex(proj[1]));
            Log.e(TAG,"" + key + "->" + value);
        }
        cursor.close();
    }
    

    在L释放中,输出为:

        11595 01-20 11:55:36.322 15833 15833 E MyExam  : alarm_alert->content://media/internal/audio/media/11
        11596 01-20 11:55:36.322 15833 15833 E MyExam  : notification_sound->content://media/internal/audio/media/24
        11597 01-20 11:55:36.322 15833 15833 E MyExam  : ringtone->content://media/internal/audio/media/36
    

    但在M版本中,我得到了以下错误:

     01-20 11:59:29.962 10141 10141 E AndroidRuntime: FATAL EXCEPTION: main
        01-20 11:59:29.962 10141 10141 E AndroidRuntime: Process: com.colibri.gaplessplayer, PID: 10141
        01-20 11:59:29.962 10141 10141 E AndroidRuntime: java.lang.IllegalArgumentException: Supported SQL:
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:   uri content://some_table/some_property with null where and where args
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:   uri content://some_table with query name=? and single name as arg
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:   uri content://some_table with query name=some_name and null args
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:   but got - uri:content://settings/system, where:value LIKE 'content%' whereArgs:null
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:    at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:    at android.content.ContentResolver.query(ContentResolver.java:491)
        01-20 11:59:29.962 10141 10141 E AndroidRuntime:    at android.content.ContentResolver.query(ContentResolver.java:434)
    

    我应该如何更改我的代码以同时适用于L和M?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Olaia    9 年前

    正如@lucky1928所说,它们现在存储在纯XML文件中。 对这些设置的访问应该是相同的,只是现在应该更加安全。

    发件人: SettingsProvider.java

    有一个关于这些设置现在如何存储(Android M)的解释。

    此类是发布系统的内容提供商 设置。可以通过内容提供商API或 自定义调用命令。后者速度稍快,是首选 访问平台设置的方式。

    有三种设置 类型,全局(具有签名级保护并跨 用户)、安全(具有签名权限级别保护和 用户)和系统(具有危险权限级别保护 用户)。全局设置存储在设备所有者下。每个 这些设置由{@链接表示 com.android.providers.settings。SettingsState}对象映射到 从最高有效位的设置类型派生的整数键 以及最低有效位中的用户id。设置是同步的 在实例化SettingsState时异步加载 持续突变。设置存储在用户特定的系统中 目录

    针对API Lollipop MR1及更低版本的应用程序可以添加 自定义设置条目并得到警告。针对更高的API 版本禁止此操作,因为系统设置不是应用程序的位置 以保存他们的状态。当程序包被删除时,它添加的设置 被删除。应用程序无法删除平台添加的系统设置。 验证系统设置值以确保客户端不会 错误的值。全局和安全设置仅由受信任的用户更改 因此不进行验证。还有一个限制 可以添加的应用程序特定设置的数量 系统进程内存占用的无限增长。

        2
  •  0
  •   lucky1928    9 年前

    是的,M设置似乎没有使用数据库,而是使用下面的xml文件来存储信息:

    /data/system/users/0/settings_global.xml
    /data/system/users/0/settings_secure.xml
    /data/system/users/0/settings_system.xml
    

    这是否意味着任何数据库查询都将失败?