2010-01-10 44 views
3

也许我正在以这种错误的方式进行讨论,但如果是这样,请纠正我。 这是情况:我有一个查询返回存储在数据库中的铃声的URI字符串。将数据添加到数据库光标

我想添加一个“列”与这个光标与振铃器“标题”(因为这可以改变我的程序之外)。

我可以成功使用RingtoneManager来获得标题,但我无法弄清楚如何将这个“列”添加到游标数据供以后使用。

这是我到目前为止有:

if (cursor != null) { 
    cursor.moveToFirst(); 
    do { 
     String ringerTitle = getRingerTitle(cursor.getString(cursor.getColumnIndex(PoolDbAdapter.KEY_RINGER))); 

     // How can I add ringerTitle to a new column here? 

    } while (cursor.moveToNext()); 
} 
+0

你的'光标'从哪里来?你能显示查询吗? – 2010-01-10 20:04:44

+0

游标来自数据库查询并返回与铃声相关的URI,例如“content:// media/audio/3” – Ryan 2010-01-10 20:24:13

回答

4

不能修改现有Cursor这种方式。您需要创建Cursor以及您最初寻找的数据。

更有可能的是,您不需要修改Cursor,而是使用Cursor的任何内容都必须更明智。例如,如果您的问题是您无法在SimpleCursorAdapter中使用计算列,则需要切换到CursorAdapter并覆盖bindView()以获得您想要的智能。

+0

不幸的是,这与我以前的SimpleCursorAdapter扩展所具有的问题有相同的问题。我无法控制bindView(或我以前的方法getView)每行被多次调用的事实,这会导致大量的丢失时间在相同的数据中多次查询RingtoneManager。我只想查询一次..是否有另一种方法我缺少映射值? – Ryan 2010-01-10 20:56:40

+0

通过setTag()缓存行中的值。您可以使用我提供的用于缓存findViewById()查找的相同技巧,在本书的免费摘录中:http://commonsware.com/Android/excerpt.pdf – CommonsWare 2010-01-10 21:06:13

+0

我似乎无法找出setTag和getTag可以实现特定的行(只有布局,ID等)..你能提供一个这样的例子吗? – Ryan 2010-01-10 21:26:07

1

我还没有尝试过(当我这样做,我会在这里更新),但是,也许下面的步骤将工作:

为了讨论各种情形,让我们调用原始光标baseCursor

  1. 使用MatrixCursor创建要添加新列(我们称之为newColumnCurs或)
  2. 然后创建一个带有baseCursor和newColumnCursor作为元素的Cursor []。
  3. 将该数组传递给MergeCursor