如何保护ContentResolver不被任何应用程序访问?

时间:2013-05-27 12:56:06

标签: android sqlite android-contentprovider

Android新手在这里。

我开始了解ContentProviders并且我已经设置了我的第一个ContentProvider,它在内部访问私有SQLiteOpenHelper类,以便从我的数据库中读取和写入数据。

我认为ContentProviders的主要好处之一就是您将所有数据访问代码放在一个地方,并且您应该访问数据库的唯一时间是通过使用ContentProvider的URI的ContentResolvers? [纠正我,如果我错了,我只是认为是这种情况,因为所有的例子都把SQLiteOpenHelper作为私人类]

所以我最近在ContentProvider中编写了一个更新方法,用于清除数据库中的列。它看起来大致像这样

    @Override
public int update(Uri uri, ContentValues values, String where,
        String[] whereArgs) {
    SQLiteDatabase database = dbHelper.getWritableDatabase();

    int count;
    switch (uriMatcher.match(uri)) {

    case FACT_ID:
        String segment = uri.getPathSegments().get(1);
        count = database.update(TABLE_FACT, values,
                KEY_ID
                        + "="
                        + segment
                        + (!TextUtils.isEmpty(where) ? " AND (" + where
                                + ')' : ""), whereArgs);
        break;
    case CLEAR_DATESEEN:
        ContentValues cv = new ContentValues();
        cv.putNull(KEY_DATESEEN);
        count = database.update(TABLE_FACT, cv, null, null);

        break;

    default:
        throw new IllegalArgumentException("Unknown URI " + uri);
    }

    getContext().getContentResolver().notifyChange(uri, null);
    return count;
}

代码的CLEAR_DATESEEN位是清除列的位。

这有效,但我只是想知道,这是不是意味着调用该URI的设备上的任何应用程序都应该能够清除该列?如果我不想让其他应用程序弄乱我的数据怎么办?

有没有办法阻止某些应用或只允许某些应用能够调用我的ContentProvider?

1 个答案:

答案 0 :(得分:1)

除非您已设置special permission并将该信息提供给其他应用(开发人员),否则您的内容提供商仅可供您的应用访问。请参阅Content Provider Permissions