用于Application之间通信的AbstractCursor的实现调用getString而不是getInt

时间:2015-07-10 10:45:39

标签: java android cursor inter-process-communicat

我正在写一个简单的客户端/服务器"使用Content Provider和从AbstractCursor扩展的自定义游标进行通信。它在两个应用程序之间提供了一个简单的密钥/对共享,每列都是一个键,每个值都是一个int(实际上我需要布尔值,但我将它们映射为0' s和1' s)

客户端应用程序使用内容解析程序打开ContentProviderClient,正确读取列名称,但在调用getInt获取值时,在服务器应用程序端,我看到正在调用getString而不是getInt。

我可以通过将它们转换为字符串来传达这些值,但有没有一种方法可以直接调用getInt,或者在传递不同的应用程序时是否必须始终进行字符串转换?

这是Provider类代码:

private static class StringBooleanCursor extends AbstractCursor {

    private final String[] keys;
    private final int[] values;

    public StringBooleanCursor(Map<String, Boolean> data) {
        List<String> lKeys = new ArrayList<String>(data.keySet());
        keys = new String[lKeys.size()];
        lKeys.toArray(keys);

        values = new int[keys.length];
        for (int i = 0 ; i < keys.length ; i++) {
            values[i] = data.get(keys[i]) ? 1 : 0;
        }
    }

    @Override public int getCount() {
        return 1;
    }

    @Override public String[] getColumnNames() {
        return keys;
    }

    @Override public String getString(int column) {
        Log.d(TAG, "getString " + column);
        return Integer.toString(values[column]);
    }

    @Override public short getShort(int column) {
        Log.d(TAG, "getShort " + column);
        return 0;
    }

    @Override public int getInt(int column) {
        Log.d(TAG, "getInt " + column + ": " + values[column]);
        return values[column];
    }

    @Override public long getLong(int column) {
        Log.d(TAG, "getLong " + column);
        return 0;
    }

    @Override public float getFloat(int column) {
        Log.d(TAG, "getFloat " + column);   
        return 0;
    }

    @Override public double getDouble(int column) {
        Log.d(TAG, "getDouble " + column);
        return 0;
    }

    @Override public boolean isNull(int column) {
        Log.d(TAG, "isNull " + column);
        return column < 0 || column >= keys.length;
    }
}

客户的相关部分:

        cursor = cpc.query(configUri, null, null, null, null);
        if (cursor != null && cursor.moveToNext()) {
            String[] keys = cursor.getColumnNames();
            for (int i = 0 ; i < keys.length ; i++) {
                Log.d(TAG, "cursor.getInt(" + i + "): " + cursor.getInt(i));
                String key = keys[i];
                boolean value = cursor.getInt(i) != 0;
                Log.d(TAG, key + " <- " + value);
            }
        }

1 个答案:

答案 0 :(得分:0)

正如塞尔文指出的那样,我必须覆盖getType。 AbstractCursor中的默认实现是这样的:

    public int getType(int column) {
        // Reflects the assumption that all commonly used field types (meaning everything
        // but blobs) are convertible to strings so it should be safe to   call
        // getString to retrieve them.
        return FIELD_TYPE_STRING;
    }

所以我用类似的东西覆盖它(在我的情况下):

    @Override public int getType(int column) {
        return FIELD_TYPE_INTEGER;
    }

现在生成对getLong(int)的调用,而不是getString(int)