Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@ import com.raizlabs.android.dbflow.kotlinextensions.result
import com.raizlabs.android.dbflow.kotlinextensions.select
import com.raizlabs.android.dbflow.kotlinextensions.where
import com.raizlabs.android.dbflow.sql.language.Delete
import com.raizlabs.android.dbflow.sql.language.OperatorGroup
import com.raizlabs.android.dbflow.structure.provider.ContentUtils
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
Expand All @@ -26,6 +29,9 @@ class ContentProviderTests : BaseUnitTest() {

@Before
fun setUp() {
}

private fun setupProvider() {
val info = ProviderInfo()
info.authority = TestContentProvider.AUTHORITY
Robolectric.buildContentProvider(TestContentProvider_Provider::class.java).create(info)
Expand All @@ -35,26 +41,67 @@ class ContentProviderTests : BaseUnitTest() {
fun testContentProviderUtils() {
Delete.tables(NoteModel::class.java, ContentProviderModel::class.java)

// query from non exist content provider
val nonExistProvider = ContentUtils.querySingle(mockContentResolver,
TestContentProvider.ContentProviderModel.CONTENT_URI,
ContentProviderModel::class.java,
OperatorGroup.clause(),
null)
assertNull(nonExistProvider)

setupProvider()

// query from content provider before any model inserted
val nonExistProviderModel = ContentUtils.querySingle(mockContentResolver,
TestContentProvider.ContentProviderModel.CONTENT_URI,
ContentProviderModel::class.java,
OperatorGroup.clause(ContentProviderModel_Table.notes.eq("Test")),
null)
assertNull(nonExistProviderModel)

// insert model
val contentProviderModel = ContentProviderModel()
contentProviderModel.notes = "Test"
var uri = ContentUtils.insert(mockContentResolver, TestContentProvider.ContentProviderModel.CONTENT_URI, contentProviderModel)
assertEquals(TestContentProvider.ContentProviderModel.CONTENT_URI.toString() + "/" + contentProviderModel.id, uri.toString())
assertTrue(contentProviderModel.exists())

// query inserted model
val queryProviderModel = ContentUtils.querySingle(mockContentResolver,
TestContentProvider.ContentProviderModel.CONTENT_URI,
ContentProviderModel::class.java,
OperatorGroup.clause(ContentProviderModel_Table.notes.eq("Test")),
null)
assertNotNull(queryProviderModel)
assertEquals(contentProviderModel.notes, queryProviderModel.notes)
assertEquals(contentProviderModel.id, queryProviderModel.id)

// update model
contentProviderModel.notes = "NewTest"
val update = ContentUtils.update(mockContentResolver, TestContentProvider.ContentProviderModel.CONTENT_URI, contentProviderModel)
assertEquals(update.toLong(), 1)
assertTrue(contentProviderModel.exists())
contentProviderModel.load()
assertEquals("NewTest", contentProviderModel.notes)

// insert model with foreign key
val noteModel = NoteModel()
noteModel.note = "Test"
noteModel.contentProviderModel = contentProviderModel
uri = ContentUtils.insert(mockContentResolver, TestContentProvider.NoteModel.CONTENT_URI, noteModel)
assertEquals(TestContentProvider.NoteModel.CONTENT_URI.toString() + "/" + noteModel.id, uri.toString())
assertTrue(noteModel.exists())

// query inserted model with foreign key
val queryNote = ContentUtils.querySingle(mockContentResolver, TestContentProvider.NoteModel.CONTENT_URI,
NoteModel::class.java,
OperatorGroup.clause(NoteModel_Table.note.eq("Test")),
null)
assertNotNull(queryNote)
assertEquals("Test", queryNote.note)
assertNotNull(queryNote.contentProviderModel)
assertEquals(contentProviderModel.id, queryNote.contentProviderModel!!.id)

assertTrue(ContentUtils.delete(mockContentResolver, TestContentProvider.NoteModel.CONTENT_URI, noteModel) > 0)
assertTrue(!noteModel.exists())

Expand All @@ -68,6 +115,13 @@ class ContentProviderTests : BaseUnitTest() {
fun testContentProviderNative() {
Delete.tables(NoteModel::class.java, ContentProviderModel::class.java)

// load model before provider setup, this may happen when load across process
val nonExistProvider = ContentProviderModel(id = 0)
nonExistProvider.load()
assertNull(nonExistProvider.notes)

setupProvider()

val contentProviderModel = ContentProviderModel(notes = "Test")
contentProviderModel.insert()
assertTrue(contentProviderModel.exists())
Expand Down Expand Up @@ -100,6 +154,13 @@ class ContentProviderTests : BaseUnitTest() {
fun testSyncableModel() {
Delete.table(TestSyncableModel::class.java)

// load model before provider setup, this may happen when load across process
val nonExistProvider = TestSyncableModel(id = 0)
nonExistProvider.load()
assertNull(nonExistProvider.name)

setupProvider()

var testSyncableModel = TestSyncableModel(name = "Name")
testSyncableModel.save()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
*/
public class FlowCursor extends CursorWrapper {

@NonNull
public static FlowCursor from(@NonNull Cursor cursor) {
if (cursor instanceof FlowCursor) {
return (FlowCursor) cursor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,12 @@ public boolean exists() {
@SuppressWarnings("unchecked")
public void load(@NonNull OperatorGroup whereConditions,
@Nullable String orderBy, String... columns) {
FlowCursor cursor = FlowCursor.from(ContentUtils.query(FlowManager.getContext().getContentResolver(),
getQueryUri(), whereConditions, orderBy, columns));
if (cursor != null && cursor.moveToFirst()) {
getModelAdapter().loadFromCursor(cursor, this);
cursor.close();
Cursor cursor = ContentUtils.query(FlowManager.getContext().getContentResolver(),
getQueryUri(), whereConditions, orderBy, columns);
FlowCursor flowCursor = cursor == null ? null : FlowCursor.from(cursor);
if (flowCursor != null && flowCursor.moveToFirst()) {
getModelAdapter().loadFromCursor(flowCursor, this);
flowCursor.close();
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.raizlabs.android.dbflow.structure.provider;

import android.content.ContentProvider;
import android.database.Cursor;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

Expand Down Expand Up @@ -46,11 +47,12 @@ public boolean update() {
@SuppressWarnings("unchecked")
public void load(@NonNull OperatorGroup whereOperatorGroup,
@Nullable String orderBy, String... columns) {
FlowCursor cursor = FlowCursor.from(ContentUtils.query(FlowManager.getContext().getContentResolver(),
getQueryUri(), whereOperatorGroup, orderBy, columns));
if (cursor != null && cursor.moveToFirst()) {
getModelAdapter().loadFromCursor(cursor, this);
cursor.close();
Cursor cursor = ContentUtils.query(FlowManager.getContext().getContentResolver(),
getQueryUri(), whereOperatorGroup, orderBy, columns);
FlowCursor flowCursor = cursor == null ? null : FlowCursor.from(cursor);
if (flowCursor != null && flowCursor.moveToFirst()) {
getModelAdapter().loadFromCursor(flowCursor, this);
flowCursor.close();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.Nullable;

import com.raizlabs.android.dbflow.annotation.provider.ContentProvider;
import com.raizlabs.android.dbflow.config.FlowLog;
Expand Down Expand Up @@ -208,6 +209,7 @@ public static <TableClass> int delete(ContentResolver contentResolver, Uri delet
* @param columns The list of columns to query.
* @return A {@link android.database.Cursor}
*/
@Nullable
public static Cursor query(ContentResolver contentResolver, Uri queryUri,
OperatorGroup whereConditions,
String orderBy, String... columns) {
Expand Down Expand Up @@ -248,11 +250,12 @@ public static <TableClass> List<TableClass> queryList(ContentResolver contentRes
Class<TableClass> table,
OperatorGroup whereConditions,
String orderBy, String... columns) {
FlowCursor cursor = FlowCursor.from(contentResolver.query(queryUri, columns, whereConditions.getQuery(), null, orderBy));
if (cursor != null) {
Cursor cursor = contentResolver.query(queryUri, columns, whereConditions.getQuery(), null, orderBy);
FlowCursor flowCursor = cursor == null ? null : FlowCursor.from(cursor);
if (flowCursor != null) {
return FlowManager.getModelAdapter(table)
.getListModelLoader()
.load(cursor);
.load(flowCursor);
}
return new ArrayList<>();
}
Expand Down