2

この状況をできるだけ単純化しようと思います。

次のコードを確認してください。

//... 
ArrayList<ContentProviderOperation> batch = Lists.newArrayList();

while(recordsToProcess){
    //... Grabbing data
    //... built a ContentProviderOperation variable named operation

    batch.add(operation);

    //... setting recordsToProcess to true or false
}

try {
    mContext.getContentResolver().applyBatch(Contract.CONTENT_AUTHORITY, batch);

    } catch (RemoteException e) {
        throw new RuntimeException("Problem applying batch operation", e);
    } catch (OperationApplicationException e) {
        throw new RuntimeException("Problem applying batch operation", e);
    }
}

このプロセス中に、次のような OperationApplicationException がスローされます。

... Problem applying batch operation
... android.content.OperationApplicationException: insert failed
... Stack Trace ....

この例外は、「挿入が失敗した場合、または影響を受ける行数が予想される数と一致しなかった場合にスローされる」および/または「指定された制約により ContentProviderOperation のアプリケーションが失敗した場合にスローされる」ことを理解しています。

私のデータベース スキーマにはほとんど制約がなく、操作に含まれるデータは有効です。

例外がスローされた理由をさらに詳しく知る方法はありますか? どの制約が失敗しましたか? 等...?

4

1 に答える 1

3

デバッグのために、私はこのようなものから始めます

   {
   .........
        int i = 0;
        for (ContentProviderOperation op : ops) {
            applySingle(WorkoutProvider.AUTHORITY, op);
            Log.e(getTag(), Integer.toString(i));
            i++;
        }
    }


protected synchronized void applySingle(String authority, ContentProviderOperation op) {
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(op);
    try {
        App.getInstance().getContentResolver().applyBatch(authority, ops);
    } catch (RemoteException e) {
        Log.e(getTag(), "Error updating workout id to server's", e);
        e.printStackTrace();
    } catch (OperationApplicationException e) {
        Log.e(getTag(), "Error updating workout id to server's", e);
        e.printStackTrace();
    }
}

次に、その for ループの前にデバッグし、どの操作が失敗したかを確認することをお勧めします。

于 2013-10-04T17:53:34.660 に答える