应用程序之间通信的 AbstractCursor 的实现调用 getString 而不是 getInt

Posted

技术标签:

【中文标题】应用程序之间通信的 AbstractCursor 的实现调用 getString 而不是 getInt【英文标题】:Implementation of AbstractCursor for communication between Applications calls getString instead of getInt 【发布时间】:2015-07-10 10:45:38 【问题描述】:

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

客户端应用程序使用内容解析器打开 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);
            
        

【问题讨论】:

您是否尝试覆盖 getType(int) ?让它总是返回FIELD_TYPE_INTEGER ...但是是的,这只是盲目猜测(默认情况下AbstractCursor返回FIELD_TYPE_STRING-我没有分析ContentProviderClient代码但也许这是一个问题)...为什么你没有使用MatrixCursor 吗? @Selvin,是的,看起来我必须覆盖 getType(int) 方法。现在它调用 getLong,这很公平。将评论写为答案,以便我将其标记为已回答并给您积分。关于 MatrixCursor,我正在试验,不确定数据传输最终会采用哪种形式,但我会看看它。谢谢! 自己写就行了,只给我一些答案:)我太懒了:) 【参考方案1】:

正如 Selvin 指出的,我必须重写 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)

【讨论】:

以上是关于应用程序之间通信的 AbstractCursor 的实现调用 getString 而不是 getInt的主要内容,如果未能解决你的问题,请参考以下文章

桌面应用程序和 Web 前端之间的通信

exe之间的通信?

iOS和Mac应用程序之间的蓝牙通信

小程序组件之间的通信

Java EE 应用程序之间的 Web 服务通信

2个应用程序之间的进程间通信