Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序之间通信的AbstractCursor实现调用getString而不是getInt_Java_Android_Cursor_Inter Process Communicat - Fatal编程技术网

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

Java 应用程序之间通信的AbstractCursor实现调用getString而不是getInt,java,android,cursor,inter-process-communicat,Java,Android,Cursor,Inter Process Communicat,我正在使用内容提供者和从AbstractCursor扩展而来的自定义游标编写一个简单的“客户机/服务器”通信。它在两个应用程序之间提供了一个简单的键/对共享,每个列都是键,每个值都是int(实际上我需要布尔值,但我将它们映射为int中的0和1) 客户端应用程序使用内容解析器打开ContentProviderClient,正确读取列名,但在调用getInt获取值时,在服务器应用程序端,我看到正在调用getString而不是getInt 我可以通过将值转换为字符串来传递这些值,但是有没有办法强制直接

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

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

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

以下是提供程序类代码:

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;
    }
}
私有静态类StringBooleanCursor扩展了AbstractCursor{
私有最终字符串[]密钥;
私有最终int[]值;
公共字符串布尔光标(地图数据){
List lKeys=newarraylist(data.keySet());
keys=新字符串[lKeys.size()];
lKeys.toArray(钥匙);
值=新整数[keys.length];
for(int i=0;i=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);
            }
        }
cursor=cpc.query(configUri,null,null,null);
if(cursor!=null&&cursor.moveToNext()){
String[]keys=cursor.getColumnNames();
for(int i=0;iLog.d(TAG,key+”正如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;
    }
所以我用如下内容覆盖它(在我的例子中):


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

您是否尝试重写
getType(int)
?让它始终返回
字段\u TYPE\u INTEGER
…但是的,这只是盲目猜测(默认情况下,
AbstractCursor
返回
字段类型字符串
-我没有分析
ContentProviderClient
代码,但可能是个问题)…为什么不使用
MatrixCursor
?@Selvin,是的,看起来我必须覆盖getType(int)方法。现在它调用getLong,这很公平。将注释作为答案写下来,这样我就可以将其标记为已回答并给你分数。关于MatrixCursor,我正在进行实验,不确定最终将采用哪种形式进行数据传输,但我会查看它。谢谢!只需自己写,并且在答案中只给我一些分数:)我太懒了:)
    @Override public int getType(int column) {
        return FIELD_TYPE_INTEGER;
    }