android M使用LIKE关键字设置db查询错误

时间:2016-01-20 18:01:52

标签: android android-contentresolver

下面的代码在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 个答案:

答案 0 :(得分:1)

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

来自:SettingsProvider.java

有关于如何存储这些设置(Android M)的说明。

  

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

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

针对API的应用程序Lollipop MR1及更低版本可以添加   自定义设置条目并获得警告。针对更高的API   版本禁止此操作,因为系统设置不适合应用   拯救他们的国家。删除包时,添加的设置   被删除。应用无法删除平台添加的系统设置。   验证系统设置值以确保客户端不放置   坏的价值观。全局和安全设置仅受信任更改   各方,因此不进行验证。还有一个限制   关于可以添加以防止的应用程序特定设置的数量   系统进程内存占用无限增长。

答案 1 :(得分:0)

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

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

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