应用程序之间通信的 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的主要内容,如果未能解决你的问题,请参考以下文章