都说ContentProvider 对外提供了对数据访问的统一接口,但是查询的方法 返回值只能是Cursor,这个就非常郁闷啊,也可能是我关于Cursor没有太深入的了解。现在项目要做组件化,许多内容的传递,需要使用ContentProvider 比如我要像另一个项目提供一个List<T> 这样的话 应该怎么通过ContentProvider进行数据通信呢? 怎么把List变成Cursor呢? 难道非得先把内容存入SQLite里面么? 可能问题太浅显 各位看官见笑了 不过还是希望有好心达人帮助解答一下。
解决方案 »
- 求救!!Android mediaplay的问题
- 刚学ANDROID,做12306的订票程序,为什么总是提示非法的订票请求?
- 请教下android客户端文件上传到servlet和PHP服务器一样吗
- 求教SeekBar 可以内部触发吗?
- 求指点思路,如何让一个progressbar竖着显示
- 谁知道怎么改模拟器的IP地址啊
- public LunarThread(SurfaceHolder surfaceHolder, Context context,Handler handler)
- android亲们请进!
- android 主动获取蓝牙设备上的联系人和通话记录问题
- 导入项目后,报错:No resource found that matches the given name
- Android如何播放Buffer里的PCM音频数据?
- 一个计时器的问题,各位进来看看
|
CrossProcessCursor
|
AbstractCursor
|
AbstractWindowedCursor
|
SQLiteCursor
Cursor cursor = contentResolver.query(Uri.parse("content://com.XXX.attribution"), null, "test", null, null);直接就跑异常了
05-15 17:32:14.044: ERROR/AndroidRuntime(939): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.test/com.android.test.MainActivity}: java.lang.NegativeArraySizeException确实已经调用到了内容提供者的query方法 通过我打的LOG已经显示 返回了我自己重写的Cursor 但是另一个应用调用的时候 就报错了 很是郁闷啊
你的代码中,自定义的cursor继承自CrossProcessCursor,那么就与任何数据都没有关系,数据结构都是完全有你自己实现的。因为只有到了AbstractCursor才会涉及与数据库的操作。
这样就可以把Cursor对象转换成List<T>对象了!我认为不需要把List转换成Cursor,但经常要把Cursor转换成List对象
Cursor初始化的时候 指针指向数据集合的位置是-1 这样的话 永远是没有这个值 会抛异常文档上说 应该实现Cursor的时候 实例化一个MatrixCursor 它其实就是我们自定义的一张表
String[] columns = new String[] { "_id","_value"};
MatrixCursor cursor = new MatrixCursor(columns);这就是表中的我们自己建立的表 第一列是id 第二列是value这样就有了自己的表 而不是从数据库得到或者是实现cursor接口String[] strs = new String[]{"0","a"};
cursor.addRow(strs);这样 我们就为表中写入了 id=0 value=a我们使用contentResolver 的query方法时候 这个游标就会正确的传递回来 不会出现什么游标包装内部的异常谢谢大家几天来的关心 虽然我自己找到了方法 但是来着有份 我就结贴啦 呵呵
{
List<Hash<String,String>> result=new ArrayList<Hash<String,String>>();
if(cursor==null)
{
return Collections.emptyList();
}
while(!cursor.moveToNext())
{
Map<String,String> amp=new HashMap<String,String>();
String s=cursor.getString(cursor.getColumnIndex("account"));
map.put("key",s);
result.add(map);
}
return result;
}