Как реализовать CrossProcessCursor совместимый универсальный пользовательский CursorWrapper
Мне удается создать рабочий CursorWrapper
, но застрять, когда я хочу использовать свой ContentProvider
через процессы.
Эти посты даже показывают, как реализовать CrossProcessCursor
интерфейс, особенно жесткий и недокументированный fillWindow()
метод:
Что делать в пользовательском методе fillWindow() ContentProvider?
Передача двоичного двоичного объекта через контент-провайдера
Проблема в том, что я могу думать только о реализации fillWindow()
он имеет дело с курсором либо со всеми столбцами, содержащими Blobs, либо Strings, либо..., но не с их сочетанием, как это должен иметь реальный курсор. Настоящая проблема здесь заключается в отсутствии getType()
функция (существует только начиная с версии v11) или getRaw()
/ putRaw()
это было бы просто скопировать двоичный файл без жалоб. Как вы справляетесь с этим, не вызывая нежелательных преобразований в ваших возвращенных значениях курсора?
1 ответ
На данный момент я реализовал это следующим образом, но он не кажется правильным или надежным:
/**
* Copy data from cursor to CursorWindow
* @param position start position of data
* @param window
*/
public void fillWindow(int position, CursorWindow window) {
if (position < 0 || position > getCount()) {
return;
}
window.acquireReference();
try {
int oldpos = this.getPosition();
this.moveToPosition(position - 1);
window.clear();
window.setStartPosition(position);
int columnNum = getColumnCount();
window.setNumColumns(columnNum);
while (moveToNext() && window.allocRow()) {
for (int i = 0; i < columnNum; i++) {
//int type = getType(i);//only from v11 on
try {
String field7 = getString(i);
if (field7 != null) {
try {
if (!window.putLong(new Long(field7), this.getPosition(), i)) {
if (!window.putDouble(new Double(field7), this.getPosition(), i)) {
if (!window.putString(field7, this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
}
} catch (NumberFormatException e) {
try {
if (!window.putDouble(new Double(field7), this.getPosition(), i)) {
if (!window.putString(field7, this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
} catch (NumberFormatException e1) {
if (!window.putString(field7, this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
}
} else {
if (!window.putNull(this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
} catch (SQLiteException e7) {
try {
byte[] field1 = getBlob(i);
if (field1 != null) {
if (!window.putBlob(field1, this.getPosition(), i)) {
window.freeLastRow();
break;
}
} else {
if (!window.putNull(this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
} catch (SQLiteException e1) {
throw e1;
}
}
}
}
this.moveToPosition(oldpos);
} catch (IllegalStateException e){
// simply ignore it
} finally {
window.releaseReference();
}
}