0

我正在尝试将数据库游标从服务(IntentService)发送到我的活动(实现接收器以捕获来自服务的任何响应)。一旦我从查询中获得数据,cursor = db.query(DBHelper.DB_BOOKS_TABLE, columns, where, whereArgs, groupBy, having, orderBy);我想通过接收器将光标从服务发送回他的调用者。但捆绑结构只是让我发送 tical 数据(字符串,整数,这样想)。我知道捆绑包还可以发送可打包对象和可序列化对象。但是我如何将典型的游标转换为可打包或可序列化的游标。谢谢。

4

2 回答 2

1

您实际上不需要使用 aBundle将任何内容从 发送ServiceActivity. 您可以在Service. 我在Service这里严格地谈论 a 而不是 a IntentService,因为我以前没有使用过它们。使用绑定Service是相同的,但只需unbindService()在完成后调用您的 Activity:

private Cursor cursor;
public void initializeCursor() {
    cursor = Cursor();
    //Now the cursor is created. Send a broadcast to the activity that it's done.
    broadcastManager.sendBroadcast("your.package.CURSOR_FINISHED");
}

并有一个getCursor()方法Activity

public Cursor getCursor() {
    return this.cursor;
}

BroadcastReceiver你的 中Activity,抓住这个事件:

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals("your.package.CURSOR_FINISHED") {
        Cursor cursor = myService.getCursor();
        unbindService(myServiceConnection);
    }
}

由于您的活动绑定到您的服务,因此您的活动中将有一个可用的服务对象。一旦你得到光标完成的广播,只需终止服务。

于 2013-03-06T20:50:04.393 回答
0

我选择制作自己的自定义类,它实现了Parcelable Interface。因为像CrossProcessCursor这样的 parcelable 游标对我来说是非常陌生的。

在我自己的 ParcelableRow 中,我只是实现了HashMap对象。为了不再担心行数或列数,我只需将光标映射到我自己的 ParcelableRow 对象。这是mi代码:

public class ParcelableRow implements Parcelable {
 private HashMap<String, String> colsMap;


 public static final Parcelable.Creator<ParcelableRow> CREATOR
 = new Parcelable.Creator<ParcelableRow>() {

    @Override
    public ParcelableRow createFromParcel(Parcel source) {
        return new ParcelableRow(source);
    }

    @Override
    public ParcelableRow[] newArray(int size) {
        return new ParcelableRow[size];
    }
};


public ParcelableRow(Parcel in) {
    colsMap = new HashMap<String, String>();
    readFromParcel(in);
}
public ParcelableRow() {
    colsMap = new HashMap<String, String>();
}
@Override
public int describeContents() {
    return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {

    for(String key: colsMap.keySet()){

        dest.writeString(key);
        dest.writeString(colsMap.get(key));

    }

}
public void readFromParcel(Parcel parcel) {

    int limit = parcel.dataSize();
    parcel.setDataPosition(0);
    for(int i = 0; i < limit; i++){
        colsMap.put(parcel.readString(), parcel.readString());
    }

}


public void addNewCol(String colName, String colValue){
    colsMap.put(colName, colValue);
}
public String getColumnValue(String colName){
    return colsMap.get(colName);
}

感谢@CommonsWare 给了我一个线索。竖起大拇指!。

我希望这对某人有用,我只是花了几天时间试图找到可以满足我需求的东西。是我使用过的一些代码示例。欢迎提出建议。

警告它只让我满意,因为我与时俱进。

继续编码!

于 2013-03-09T03:52:50.977 回答