都说ContentProvider  对外提供了对数据访问的统一接口,但是查询的方法  返回值只能是Cursor,这个就非常郁闷啊,也可能是我关于Cursor没有太深入的了解。现在项目要做组件化,许多内容的传递,需要使用ContentProvider  比如我要像另一个项目提供一个List<T>  这样的话  应该怎么通过ContentProvider进行数据通信呢?  怎么把List变成Cursor呢? 难道非得先把内容存入SQLite里面么?   可能问题太浅显  各位看官见笑了    不过还是希望有好心达人帮助解答一下。

解决方案 »

  1.   

    不明白组件之间是否一定要用ContentProvider来通信。理论上是可以将数据打包到bundle中,然后将bundle传输出去,这样可以撇开数据库。
      

  2.   

    这里会涉及到进程间通信  所以需要用ContentProvider   再说android为我们提供了这样的工具  对外提供了统一的内容访问接口  我们当然要加以利用了    只是使用的时候  有些技术上的盲点   所以需要大家的帮助啊 呵呵
      

  3.   

    如果你想要用cursor但是又不想将数据存储到数据库中,我想你需要实现一下AbstractWindowedCursor或者AbstractCursor或者CrossProcessCursor后者Cursor。因为平常通过数据库获得的cursor,都是SQLiteCursor。他们的关系:            Cursor
                  |
              CrossProcessCursor
                  |
             AbstractCursor
                  |
           AbstractWindowedCursor
                  |
             SQLiteCursor
      

  4.   

    我直接都实现Cursor了  但是这样不行的  cursor我觉得  就是指向数据集的一个位置   就算我直接实现它了  然后怎么往里面放数据呢?  就算我实现了   query方法返回的是我实现的cursor的子类  这样其他应用访问的时候   如果它不知道我这个子类   那又有什么用呢   直接用cursor  得到的会是什么数据呢哎~~ 头疼
      

  5.   

    一般的应用都是直接调用的cursor这个接口,你只要实现里面的公共方法就好。用户不需要关心cursor中的数据是怎么获得的,你可以自己组织数据结构,不见得一定是个数据集。只要是一个自定义cursor可以控制的自定义数据结构就好。
      

  6.   

    我自己实现了一个游标  public class HCursor implements CrossProcessCursor   实现这个游标 就可以跨进程访问   然后我获得游标的时候
    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  但是另一个应用调用的时候  就报错了  很是郁闷啊
      

  7.   

    java.lang.NegativeArraySizeException 这个是你自己程序创建了一个大小为负数的数组造成的,检查代码吧。看看什么地方参数错了吧。
      

  8.   

    我直接重新是实现了一个cursor  然后就返回了  没创建什么数组啊
      

  9.   

    主要代码就是上面的啊   还有实现Cursor的接口   是eclipse自动实现的  我什么都没做啊。 各位不信 可以自己试验一下  最多用15分钟  我昨天看了一个帖子   cursor这东西主要是指向底层数据集合的   不能自己实现  然后把内容放进cursor里面  具体怎么回事儿  还在研究
      

  10.   


    你的代码中,自定义的cursor继承自CrossProcessCursor,那么就与任何数据都没有关系,数据结构都是完全有你自己实现的。因为只有到了AbstractCursor才会涉及与数据库的操作。
      

  11.   

    Cursor对象保存的是一列列的数据!我们可以迭代Cursor对象把每一列变成一个对象再把对象存入List里面
    这样就可以把Cursor对象转换成List<T>对象了!我认为不需要把List转换成Cursor,但经常要把Cursor转换成List对象
      

  12.   

    ContentProvider 提供的接口  返回值就是cursor  呵呵  不转成cursor  怎么对外提供啊
      

  13.   

    Ladies and 乡亲们   经过了一天的研究   终于让我整明白了   现在和大家分享ContentProvider  我们实现了其中的几个方法   这点大家都知道   但是query方法 返回的Cursor  自己实现 然后把需要传递的数据结构放进自己写的Cursor里   这样是不正确的   有时候想想可能觉得可以  但是实际测试的时候  是行不通的  因为Cursor 指向的是底层数据的集合  自己不能携带什么数据  或者说不应该携带数据
    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方法时候  这个游标就会正确的传递回来  不会出现什么游标包装内部的异常谢谢大家几天来的关心  虽然我自己找到了方法  但是来着有份   我就结贴啦   呵呵  
      

  14.   

     List<Map<String, String>> resultList = converCursorToList(cursor);
      

  15.   

    ContentProvider 对外提供了对数据访问的统一接口,但是查询的方法返回值是Cursor,可以将Cursor转换成list,如下:private List<Hash<String,String>> list cursorConverToList(Cursor cursor)
    {
           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;
    }