diff options
| -rw-r--r-- | packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java | 188 | ||||
| -rw-r--r-- | packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java | 205 |
2 files changed, 287 insertions, 106 deletions
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java index 05343136cca7..8568da0fb37b 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java @@ -84,8 +84,7 @@ class MtpDatabase { DocumentsContract.Document.COLUMN_DOCUMENT_ID + " = ?"; private static final String SELECTION_ROOT_DOCUMENTS = COLUMN_DEVICE_ID + " = ? AND " + COLUMN_PARENT_DOCUMENT_ID + " IS NULL"; - private static final String SELECTION_ROOT_DOCUMENTS_WITH_STATE = - SELECTION_ROOT_DOCUMENTS + " AND " + COLUMN_ROW_STATE + " = ?"; + private static final String SELECTION_CHILD_DOCUMENTS = COLUMN_PARENT_DOCUMENT_ID + " = ?"; static class ParentNotFoundException extends Exception {} @@ -136,7 +135,7 @@ class MtpDatabase { } @VisibleForTesting - Cursor queryChildDocuments(String[] columnNames) { + Cursor queryRootDocuments(String[] columnNames) { return database.query( TABLE_DOCUMENTS, columnNames, @@ -159,84 +158,27 @@ class MtpDatabase { null); } - /** - * Puts the roots into the database. - * If the database found another unmapped document that shares the same name with the root, - * the document may be merged into the unmapped document. In that case, the database marks the - * root as 'mapping' and wait for {@link #resolveRootDocuments(int)} is invoked. - * @param deviceId Device ID of roots. - * @param resources Resources used to get localized root name. - * @param roots Roots added to the database. - */ @VisibleForTesting void putRootDocuments(int deviceId, Resources resources, MtpRoot[] roots) { - database.beginTransaction(); - try { - // Add roots to database. - final ContentValues values = new ContentValues(); - for (int i = 0; i < roots.length; i++) { - getRootDocumentValues(values, resources, roots[i]); - final String displayName = - values.getAsString(DocumentsContract.Document.COLUMN_DISPLAY_NAME); - final long numUnmapped = DatabaseUtils.queryNumEntries( - database, - TABLE_DOCUMENTS, - SELECTION_ROOT_DOCUMENTS_WITH_STATE + " AND " + - DocumentsContract.Document.COLUMN_DISPLAY_NAME + " = ?", - strings(deviceId, ROW_STATE_UNMAPPED, displayName)); - if (numUnmapped != 0) { - values.put(COLUMN_ROW_STATE, ROW_STATE_MAPPING); - } - database.insert(TABLE_DOCUMENTS, null, values); + final ContentValues[] valuesList = new ContentValues[roots.length]; + for (int i = 0; i < roots.length; i++) { + if (roots[i].mDeviceId != deviceId) { + throw new IllegalArgumentException(); } - database.setTransactionSuccessful(); - } finally { - database.endTransaction(); + valuesList[i] = new ContentValues(); + getRootDocumentValues(valuesList[i], resources, roots[i]); } + putDocuments(valuesList, SELECTION_ROOT_DOCUMENTS, Integer.toString(deviceId)); } @VisibleForTesting - void putDocument(int deviceId, MtpObjectInfo info) throws Exception { - database.beginTransaction(); - try { - final String mimeType = CursorHelper.formatTypeToMimeType(info.getFormat()); - - int flag = 0; - if (info.getProtectionStatus() == 0) { - flag |= DocumentsContract.Document.FLAG_SUPPORTS_DELETE | - DocumentsContract.Document.FLAG_SUPPORTS_WRITE; - if (mimeType == DocumentsContract.Document.MIME_TYPE_DIR) { - flag |= DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE; - } - } - if (info.getThumbCompressedSize() > 0) { - flag |= DocumentsContract.Document.FLAG_SUPPORTS_THUMBNAIL; - } - - final ContentValues values = new ContentValues(); - values.put(COLUMN_DEVICE_ID, deviceId); - values.put(COLUMN_STORAGE_ID, info.getStorageId()); - values.put(COLUMN_OBJECT_HANDLE, info.getObjectHandle()); - // TODO: Specify correct document ID. - values.putNull(COLUMN_PARENT_DOCUMENT_ID); - values.put(COLUMN_ROW_STATE, ROW_STATE_MAPPED); - values.put(Document.COLUMN_MIME_TYPE, mimeType); - values.put(Document.COLUMN_DISPLAY_NAME, info.getName()); - values.putNull(Document.COLUMN_SUMMARY); - values.put( - Document.COLUMN_LAST_MODIFIED, - info.getDateModified() != 0 ? info.getDateModified() : null); - values.putNull(Document.COLUMN_ICON); - values.put(Document.COLUMN_FLAGS, flag); - values.put(Document.COLUMN_SIZE, info.getCompressedSize()); - if (database.insert(TABLE_DOCUMENTS, null, values) == -1) { - throw new Exception("Failed to add document."); - } - - database.setTransactionSuccessful(); - } finally { - database.endTransaction(); + void putChildDocuments(int deviceId, String parentId, MtpObjectInfo[] documents) { + final ContentValues[] valuesList = new ContentValues[documents.length]; + for (int i = 0; i < documents.length; i++) { + valuesList[i] = new ContentValues(); + getChildDocumentValues(valuesList[i], deviceId, parentId, documents[i]); } + putDocuments(valuesList, SELECTION_CHILD_DOCUMENTS, parentId); } /** @@ -261,15 +203,59 @@ class MtpDatabase { } } + @VisibleForTesting + void resolveRootDocuments(int deviceId) { + resolveDocuments(SELECTION_ROOT_DOCUMENTS, Integer.toString(deviceId)); + } + + @VisibleForTesting + void resolveChildDocuments(String parentId) { + resolveDocuments(SELECTION_CHILD_DOCUMENTS, parentId); + } + + /** + * Puts the documents into the database. + * If the database found another unmapped document that shares the same name and parent, + * the document may be merged into the unmapped document. In that case, the database marks the + * root as 'mapping' and wait for {@link #resolveRootDocuments(int)} is invoked. + * @param valuesList Values that are stored in the database. + * @param selection SQL where closure to select rows that shares the same parent. + * @param arg Argument for selection SQL. + */ + private void putDocuments(ContentValues[] valuesList, String selection, String arg) { + database.beginTransaction(); + try { + for (final ContentValues values : valuesList) { + final String displayName = + values.getAsString(DocumentsContract.Document.COLUMN_DISPLAY_NAME); + final long numUnmapped = DatabaseUtils.queryNumEntries( + database, + TABLE_DOCUMENTS, + selection + " AND " + + COLUMN_ROW_STATE + " = ? AND " + + DocumentsContract.Document.COLUMN_DISPLAY_NAME + " = ?", + strings(arg, ROW_STATE_UNMAPPED, displayName)); + if (numUnmapped != 0) { + values.put(COLUMN_ROW_STATE, ROW_STATE_MAPPING); + } + database.insert(TABLE_DOCUMENTS, null, values); + } + + database.setTransactionSuccessful(); + } finally { + database.endTransaction(); + } + } + /** * Maps 'unmapped' document and 'mapping' document that don't have document but shares the same * name. * If the database does not find corresponding 'mapping' document, it just removes 'unmapped' * document from the database. - * @param deviceId Device ID of roots which the method tries to resolve. + * @param selection Query to select rows for resolving. + * @param arg Argument for selection SQL. */ - @VisibleForTesting - void resolveRootDocuments(int deviceId) { + private void resolveDocuments(String selection, String arg) { database.beginTransaction(); try { // Get 1-to-1 mapping of unmapped document and mapping document. @@ -290,8 +276,8 @@ class MtpDatabase { "group_concat(" + unmappedIdQuery + ")", "group_concat(" + mappingIdQuery + ")" }, - SELECTION_ROOT_DOCUMENTS, - strings(deviceId), + selection, + strings(arg), DocumentsContract.Document.COLUMN_DISPLAY_NAME, "count(" + unmappedIdQuery + ") = 1 AND count(" + mappingIdQuery + ") = 1", null); @@ -335,8 +321,8 @@ class MtpDatabase { // Delete all unmapped rows that cannot be mapped. database.delete( TABLE_DOCUMENTS, - SELECTION_ROOT_DOCUMENTS_WITH_STATE, - strings(deviceId, ROW_STATE_UNMAPPED)); + COLUMN_ROW_STATE + " = ? AND " + selection, + strings(ROW_STATE_UNMAPPED, arg)); // The database cannot find old document ID for the mapping rows. // Turn the all mapping rows into mapped state, which means the rows become to be @@ -346,8 +332,8 @@ class MtpDatabase { database.update( TABLE_DOCUMENTS, values, - SELECTION_ROOT_DOCUMENTS_WITH_STATE, - strings(deviceId, ROW_STATE_MAPPING)); + COLUMN_ROW_STATE + " = ? AND " + selection, + strings(ROW_STATE_MAPPING, arg)); database.setTransactionSuccessful(); } finally { database.endTransaction(); @@ -379,6 +365,44 @@ class MtpDatabase { } /** + * Gets {@link ContentValues} for the given MTP object. + * @param values {@link ContentValues} that receives values. + * @param deviceId Device ID of the object. + * @param parentId Parent document ID of the object. + * @param info MTP object info. + */ + private void getChildDocumentValues( + ContentValues values, int deviceId, String parentId, MtpObjectInfo info) { + values.clear(); + final String mimeType = CursorHelper.formatTypeToMimeType(info.getFormat()); + int flag = 0; + if (info.getProtectionStatus() == 0) { + flag |= DocumentsContract.Document.FLAG_SUPPORTS_DELETE | + DocumentsContract.Document.FLAG_SUPPORTS_WRITE; + if (mimeType == DocumentsContract.Document.MIME_TYPE_DIR) { + flag |= DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE; + } + } + if (info.getThumbCompressedSize() > 0) { + flag |= DocumentsContract.Document.FLAG_SUPPORTS_THUMBNAIL; + } + values.put(COLUMN_DEVICE_ID, deviceId); + values.put(COLUMN_STORAGE_ID, info.getStorageId()); + values.put(COLUMN_OBJECT_HANDLE, info.getObjectHandle()); + values.put(COLUMN_PARENT_DOCUMENT_ID, parentId); + values.put(COLUMN_ROW_STATE, ROW_STATE_MAPPED); + values.put(Document.COLUMN_MIME_TYPE, mimeType); + values.put(Document.COLUMN_DISPLAY_NAME, info.getName()); + values.putNull(Document.COLUMN_SUMMARY); + values.put( + Document.COLUMN_LAST_MODIFIED, + info.getDateModified() != 0 ? info.getDateModified() : null); + values.putNull(Document.COLUMN_ICON); + values.put(Document.COLUMN_FLAGS, flag); + values.put(Document.COLUMN_SIZE, info.getCompressedSize()); + } + + /** * Converts values into string array. * @param args Values converted into string array. * @return String array. diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java index e7d84815dce3..7bc9972ece3d 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java @@ -46,7 +46,7 @@ public class MtpDatabaseTest extends AndroidTestCase { MtpDatabase.deleteDatabase(getContext()); } - public void testPutRootDocument() throws Exception { + public void testPutRootDocuments() throws Exception { final MtpDatabase database = new MtpDatabase(getContext()); database.putRootDocuments(0, resources, new MtpRoot[] { new MtpRoot(0, 1, "Device", "Storage", 1000, 2000, ""), @@ -54,7 +54,7 @@ public class MtpDatabaseTest extends AndroidTestCase { new MtpRoot(0, 3, "Device", "/@#%&<>Storage", 1000, 2000,"") }); - final Cursor cursor = database.queryChildDocuments(COLUMN_NAMES); + final Cursor cursor = database.queryRootDocuments(COLUMN_NAMES); assertEquals(3, cursor.getCount()); cursor.moveToNext(); @@ -81,25 +81,34 @@ public class MtpDatabaseTest extends AndroidTestCase { cursor.close(); } - public void testPutDocument() throws Exception { - final MtpDatabase database = new MtpDatabase(getContext()); + private MtpObjectInfo createDocument(int objectHandle, String name, int format, int size) { final MtpObjectInfo.Builder builder = new MtpObjectInfo.Builder(); - builder.setObjectHandle(100); - builder.setName("test.txt"); - builder.setStorageId(5); - builder.setFormat(MtpConstants.FORMAT_TEXT); - builder.setCompressedSize(1000); - database.putDocument(0, builder.build()); - - final Cursor cursor = database.queryChildDocuments(COLUMN_NAMES); - assertEquals(1, cursor.getCount()); + builder.setObjectHandle(objectHandle); + builder.setName(name); + builder.setFormat(format); + builder.setCompressedSize(size); + return builder.build(); + } + + public void testPutChildDocuments() throws Exception { + final MtpDatabase database = new MtpDatabase(getContext()); + + database.putChildDocuments(0, "parentId", new MtpObjectInfo[] { + createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), + createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024), + createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024) + }); + + final Cursor cursor = database.queryChildDocuments(COLUMN_NAMES, "parentId"); + assertEquals(3, cursor.getCount()); + cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); assertEquals("deviceId", 0, cursor.getInt(1)); - assertEquals("storageId", 5, cursor.getInt(2)); + assertEquals("storageId", 0, cursor.getInt(2)); assertEquals("objectHandle", 100, cursor.getInt(3)); assertEquals("mimeType", "text/plain", cursor.getString(4)); - assertEquals("displayName", "test.txt", cursor.getString(5)); + assertEquals("displayName", "note.txt", cursor.getString(5)); assertTrue("summary", cursor.isNull(6)); assertTrue("lastModified", cursor.isNull(7)); assertTrue("icon", cursor.isNull(8)); @@ -108,7 +117,43 @@ public class MtpDatabaseTest extends AndroidTestCase { DocumentsContract.Document.FLAG_SUPPORTS_DELETE | DocumentsContract.Document.FLAG_SUPPORTS_WRITE, cursor.getInt(9)); - assertEquals("size", 1000, cursor.getInt(10)); + assertEquals("size", 1024, cursor.getInt(10)); + + cursor.moveToNext(); + assertEquals("documentId", 2, cursor.getInt(0)); + assertEquals("deviceId", 0, cursor.getInt(1)); + assertEquals("storageId", 0, cursor.getInt(2)); + assertEquals("objectHandle", 101, cursor.getInt(3)); + assertEquals("mimeType", "image/jpeg", cursor.getString(4)); + assertEquals("displayName", "image.jpg", cursor.getString(5)); + assertTrue("summary", cursor.isNull(6)); + assertTrue("lastModified", cursor.isNull(7)); + assertTrue("icon", cursor.isNull(8)); + assertEquals( + "flag", + DocumentsContract.Document.FLAG_SUPPORTS_DELETE | + DocumentsContract.Document.FLAG_SUPPORTS_WRITE, + cursor.getInt(9)); + assertEquals("size", 2 * 1024 * 1024, cursor.getInt(10)); + + cursor.moveToNext(); + assertEquals("documentId", 3, cursor.getInt(0)); + assertEquals("deviceId", 0, cursor.getInt(1)); + assertEquals("storageId", 0, cursor.getInt(2)); + assertEquals("objectHandle", 102, cursor.getInt(3)); + assertEquals("mimeType", "audio/mpeg", cursor.getString(4)); + assertEquals("displayName", "music.mp3", cursor.getString(5)); + assertTrue("summary", cursor.isNull(6)); + assertTrue("lastModified", cursor.isNull(7)); + assertTrue("icon", cursor.isNull(8)); + assertEquals( + "flag", + DocumentsContract.Document.FLAG_SUPPORTS_DELETE | + DocumentsContract.Document.FLAG_SUPPORTS_WRITE, + cursor.getInt(9)); + assertEquals("size", 3 * 1024 * 1024, cursor.getInt(10)); + + cursor.close(); } public void testRestoreIdForRootDocuments() throws Exception { @@ -124,7 +169,7 @@ public class MtpDatabaseTest extends AndroidTestCase { }); { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); @@ -140,7 +185,7 @@ public class MtpDatabaseTest extends AndroidTestCase { database.clearMapping(); { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); @@ -159,7 +204,7 @@ public class MtpDatabaseTest extends AndroidTestCase { }); { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(3, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); @@ -179,7 +224,7 @@ public class MtpDatabaseTest extends AndroidTestCase { database.resolveRootDocuments(0); { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); @@ -193,6 +238,78 @@ public class MtpDatabaseTest extends AndroidTestCase { } } + public void testRestoreIdForChildDocuments() throws Exception { + final MtpDatabase database = new MtpDatabase(getContext()); + final String[] columns = new String[] { + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + MtpDatabase.COLUMN_OBJECT_HANDLE, + DocumentsContract.Document.COLUMN_DISPLAY_NAME + }; + database.putChildDocuments(0, "parentId", new MtpObjectInfo[] { + createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), + createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024), + createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024) + }); + database.clearMapping(); + + { + final Cursor cursor = database.queryChildDocuments(columns, "parentId"); + assertEquals(3, cursor.getCount()); + + cursor.moveToNext(); + assertEquals("documentId", 1, cursor.getInt(0)); + assertTrue("objectHandle", cursor.isNull(1)); + assertEquals("name", "note.txt", cursor.getString(2)); + + cursor.moveToNext(); + assertEquals("documentId", 2, cursor.getInt(0)); + assertTrue("objectHandle", cursor.isNull(1)); + assertEquals("name", "image.jpg", cursor.getString(2)); + + cursor.moveToNext(); + assertEquals("documentId", 3, cursor.getInt(0)); + assertTrue("objectHandle", cursor.isNull(1)); + assertEquals("name", "music.mp3", cursor.getString(2)); + + cursor.close(); + } + + database.putChildDocuments(0, "parentId", new MtpObjectInfo[] { + createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), + createDocument(203, "video.mp4", MtpConstants.FORMAT_MP4_CONTAINER, 1024), + }); + + { + final Cursor cursor = database.queryChildDocuments(columns, "parentId"); + assertEquals(4, cursor.getCount()); + + cursor.moveToPosition(3); + assertEquals("documentId", 5, cursor.getInt(0)); + assertEquals("objectHandle", 203, cursor.getInt(1)); + assertEquals("name", "video.mp4", cursor.getString(2)); + + cursor.close(); + } + + database.resolveChildDocuments("parentId"); + + { + final Cursor cursor = database.queryChildDocuments(columns, "parentId"); + assertEquals(2, cursor.getCount()); + + cursor.moveToNext(); + assertEquals("documentId", 1, cursor.getInt(0)); + assertEquals("objectHandle", 200, cursor.getInt(1)); + assertEquals("name", "note.txt", cursor.getString(2)); + + cursor.moveToNext(); + assertEquals("documentId", 5, cursor.getInt(0)); + assertEquals("objectHandle", 203, cursor.getInt(1)); + assertEquals("name", "video.mp4", cursor.getString(2)); + cursor.close(); + } + } + public void testRestoreIdForDifferentDevices() throws Exception { final MtpDatabase database = new MtpDatabase(getContext()); final String[] columns = new String[] { @@ -208,7 +325,7 @@ public class MtpDatabaseTest extends AndroidTestCase { }); { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); @@ -231,8 +348,9 @@ public class MtpDatabaseTest extends AndroidTestCase { }); database.resolveRootDocuments(0); database.resolveRootDocuments(1); + { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); @@ -246,6 +364,45 @@ public class MtpDatabaseTest extends AndroidTestCase { } } + public void testRestoreIdForDifferentParents() throws Exception { + final MtpDatabase database = new MtpDatabase(getContext()); + final String[] columns = new String[] { + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + MtpDatabase.COLUMN_OBJECT_HANDLE + }; + database.putChildDocuments(0, "parentId1", new MtpObjectInfo[] { + createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), + }); + database.putChildDocuments(0, "parentId2", new MtpObjectInfo[] { + createDocument(101, "note.txt", MtpConstants.FORMAT_TEXT, 1024), + }); + database.clearMapping(); + database.putChildDocuments(0, "parentId1", new MtpObjectInfo[] { + createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), + }); + database.putChildDocuments(0, "parentId2", new MtpObjectInfo[] { + createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024), + }); + database.resolveChildDocuments("parentId1"); + + { + final Cursor cursor = database.queryChildDocuments(columns, "parentId1"); + assertEquals(1, cursor.getCount()); + cursor.moveToNext(); + assertEquals("documentId", 1, cursor.getInt(0)); + assertEquals("objectHandle", 200, cursor.getInt(1)); + cursor.close(); + } + { + final Cursor cursor = database.queryChildDocuments(columns, "parentId2"); + assertEquals(1, cursor.getCount()); + cursor.moveToNext(); + assertEquals("documentId", 2, cursor.getInt(0)); + assertTrue("objectHandle", cursor.isNull(1)); + cursor.close(); + } + } + public void testClearMtpIdentifierBeforeResolveRootDocuments() { final MtpDatabase database = new MtpDatabase(getContext()); final String[] columns = new String[] { @@ -266,7 +423,7 @@ public class MtpDatabaseTest extends AndroidTestCase { }); database.resolveRootDocuments(0); { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(1, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 1, cursor.getInt(0)); @@ -293,7 +450,7 @@ public class MtpDatabaseTest extends AndroidTestCase { }); database.resolveRootDocuments(0); { - final Cursor cursor = database.queryChildDocuments(columns); + final Cursor cursor = database.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("documentId", 2, cursor.getInt(0)); |