diff --git a/contentprovider-annotations/src/main/java/com/dbflow5/contentprovider/annotation/ContentType.java b/contentprovider-annotations/src/main/java/com/dbflow5/contentprovider/annotation/ContentType.java index c7eb26ed8cc5689393ee86b807bb743ebe9f16f2..1731a4644434fbd3da0208de5b85bab8b66279fa 100644 --- a/contentprovider-annotations/src/main/java/com/dbflow5/contentprovider/annotation/ContentType.java +++ b/contentprovider-annotations/src/main/java/com/dbflow5/contentprovider/annotation/ContentType.java @@ -1,7 +1,7 @@ package com.dbflow5.contentprovider.annotation; public class ContentType { - public static final String VND_MULTIPLE = "vnd.android.cursor.dir/"; + public static final String VND_MULTIPLE = "vnd.ohos.cursor.dir/"; - public static final String VND_SINGLE = "vnd.android.cursor.item/"; + public static final String VND_SINGLE = "vnd.ohos.cursor.item/"; } diff --git a/contentprovider/src/main/java/com/dbflow5/provider/ContentUtils.java b/contentprovider/src/main/java/com/dbflow5/provider/ContentUtils.java index 4149eecb28136a5f102844bd72aa451a8dd59b2d..51f84cb77d005dfac6de3786240fb1aca78e3f5c 100644 --- a/contentprovider/src/main/java/com/dbflow5/provider/ContentUtils.java +++ b/contentprovider/src/main/java/com/dbflow5/provider/ContentUtils.java @@ -18,11 +18,11 @@ import java.util.ArrayList; import java.util.List; /** - * Description: Provides handy wrapper mechanisms for [android.content.ContentProvider] + * Description: Provides handy wrapper mechanisms for [ContentProvider] */ public class ContentUtils { /** - * The default content URI that Android recommends. Not necessary, however. + * The default content URI that ohos recommends. Not necessary, however. */ public static final String BASE_CONTENT_URI = "content://"; @@ -54,11 +54,11 @@ public class ContentUtils { } /** - * Inserts the model into the [android.content.ContentResolver]. Uses the insertUri to resolve - * the reference and the model to convert its data into [android.content.ContentValues] + * Inserts the model into the [ContentResolver]. Uses the insertUri to resolve + * the reference and the model to convert its data into [ContentValues] * * @param context context - * @param insertUri A [android.net.Uri] from the [ContentProvider] class definition. + * @param insertUri A [Uri] from the [ContentProvider] class definition. * @param model The model to insert. * @param TableClass * @return A Uri of the inserted data. @@ -69,11 +69,11 @@ public class ContentUtils { } /** - * Inserts the model into the [android.content.ContentResolver]. Uses the insertUri to resolve - * the reference and the model to convert its data into [android.content.ContentValues] + * Inserts the model into the [ContentResolver]. Uses the insertUri to resolve + * the reference and the model to convert its data into [ContentValues] * * @param contentResolver The content resolver to use - * @param insertUri A [android.net.Uri] from the [ContentProvider] class definition. + * @param insertUri A [Uri] from the [ContentProvider] class definition. * @param model The model to insert. * @return The Uri of the inserted data. * @throws DataAbilityRemoteException DataAbilityRemoteException @@ -137,11 +137,11 @@ public class ContentUtils { } /** - * Updates the model through the [android.content.ContentResolver]. Uses the updateUri to - * resolve the reference and the model to convert its data in [android.content.ContentValues] + * Updates the model through the [ContentResolver]. Uses the updateUri to + * resolve the reference and the model to convert its data in [ContentValues] * * @param context context - * @param updateUri A [android.net.Uri] from the [ContentProvider] + * @param updateUri A [Uri] from the [ContentProvider] * @param model A model to update * @param TableClass * @return The number of rows updated. @@ -152,11 +152,11 @@ public class ContentUtils { } /** - * Updates the model through the [android.content.ContentResolver]. Uses the updateUri to - * resolve the reference and the model to convert its data in [android.content.ContentValues] + * Updates the model through the [ContentResolver]. Uses the updateUri to + * resolve the reference and the model to convert its data in [ContentValues] * * @param contentResolver The content resolver to use - * @param updateUri A [android.net.Uri] from the [ContentProvider] + * @param updateUri A [Uri] from the [ContentProvider] * @param model The model to update * @param TableClass * @return The number of rows updated. @@ -179,11 +179,11 @@ public class ContentUtils { } /** - * Deletes the specified model through the [android.content.ContentResolver]. Uses the deleteUri + * Deletes the specified model through the [ContentResolver]. Uses the deleteUri * to resolve the reference and the model to [ModelAdapter.getPrimaryConditionClause]} * * @param context context - * @param deleteUri A [android.net.Uri] from the [ContentProvider] + * @param deleteUri A [Uri] from the [ContentProvider] * @param model The model to delete * @param TableClass * @return The number of rows deleted. @@ -194,11 +194,11 @@ public class ContentUtils { } /** - * Deletes the specified model through the [android.content.ContentResolver]. Uses the deleteUri + * Deletes the specified model through the [ContentResolver]. Uses the deleteUri * to resolve the reference and the model to [ModelAdapter.getPrimaryConditionClause] * * @param contentResolver The content resolver to use - * @param deleteUri A [android.net.Uri] from the [ContentProvider] + * @param deleteUri A [Uri] from the [ContentProvider] * @param model The model to delete * @param TableClass * @return The number of rows deleted. @@ -222,15 +222,15 @@ public class ContentUtils { } /** - * Queries the [android.content.ContentResolver] with the specified query uri. It generates - * the correct query and returns a [android.database.Cursor] + * Queries the [ContentResolver] with the specified query uri. It generates + * the correct query and returns a [ohos.database.Cursor] * * @param contentResolver The content resolver to use * @param queryUri The URI of the query * @param whereConditions The set of [Operator] to query the content provider. * @param orderBy The order by clause without the ORDER BY * @param columns The list of columns to query. - * @return A [android.database.Cursor] + * @return A [ohos.database.Cursor] * @throws DataAbilityRemoteException DataAbilityRemoteException */ public static FlowCursor query(DataAbilityHelper contentResolver, Uri queryUri, OperatorGroup whereConditions, String orderBy, String... columns) throws DataAbilityRemoteException { @@ -245,7 +245,7 @@ public class ContentUtils { } /** - * Queries the [android.content.ContentResolver] with the specified queryUri. It will generate + * Queries the [ContentResolver] with the specified queryUri. It will generate * the correct query and return a list of [TableClass] * * @param context context @@ -267,7 +267,7 @@ public class ContentUtils { } /** - * Queries the [android.content.ContentResolver] with the specified queryUri. It will generate + * Queries the [ContentResolver] with the specified queryUri. It will generate * the correct query and return a list of [TableClass] * * @param contentResolver The content resolver to use @@ -301,7 +301,7 @@ public class ContentUtils { } /** - * Queries the [android.content.ContentResolver] with the specified queryUri. It will generate + * Queries the [ContentResolver] with the specified queryUri. It will generate * the correct query and return a the first item from the list of [TableClass] * * @param context context @@ -323,7 +323,7 @@ public class ContentUtils { } /** - * Queries the [android.content.ContentResolver] with the specified queryUri. It will generate + * Queries the [ContentResolver] with the specified queryUri. It will generate * the correct query and return a the first item from the list of [TableClass] * * @param contentResolver The content resolver to use diff --git a/contentprovider/src/main/java/com/dbflow5/provider/ModelProvider.java b/contentprovider/src/main/java/com/dbflow5/provider/ModelProvider.java index a99e509de6b59881dd9b7574dc7c1cb9aaf29c12..ddc9266045dcba6564dd4e5bc351262b64ffc241 100644 --- a/contentprovider/src/main/java/com/dbflow5/provider/ModelProvider.java +++ b/contentprovider/src/main/java/com/dbflow5/provider/ModelProvider.java @@ -12,30 +12,30 @@ import ohos.utils.net.Uri; public interface ModelProvider { /** - * The [android.net.Uri] that passes to a [android.content.ContentProvider] to delete a Model. + * The [Uri] that passes to a [ContentProvider] to delete a Model. * - * @return The [android.net.Uri] that passes to a [android.content.ContentProvider] to delete a Model. + * @return The [Uri] that passes to a [ContentProvider] to delete a Model. */ Uri deleteUri(); /** - * The [android.net.Uri] that passes to a [android.content.ContentProvider] to insert a Model. + * The [Uri] that passes to a [ContentProvider] to insert a Model. * - * @return The [android.net.Uri] that passes to a [android.content.ContentProvider] to insert a Model. + * @return The [Uri] that passes to a [ContentProvider] to insert a Model. */ Uri insertUri(); /** - * The [android.net.Uri] that passes to a [android.content.ContentProvider] to update a Model. + * The [Uri] that passes to a [ContentProvider] to update a Model. * - * @return The [android.net.Uri] that passes to a [android.content.ContentProvider] to update a Model. + * @return The [Uri] that passes to a [ContentProvider] to update a Model. */ Uri updateUri(); /** - * The [android.net.Uri] that passes to a [android.content.ContentProvider] to query a Model. + * The [Uri] that passes to a [ContentProvider] to query a Model. * - * @return The [android.net.Uri] that passes to a [android.content.ContentProvider] to query a Model. + * @return The [Uri] that passes to a [ContentProvider] to query a Model. */ Uri queryUri(); diff --git a/contentprovider/src/main/java/com/dbflow5/provider/StubContentProvider.java b/contentprovider/src/main/java/com/dbflow5/provider/StubContentProvider.java index c2af5a57e000abc1efe92294a7aef6996149cff9..6ea87673c2956a5d76a3d7fc2a6622a2a7bb29f1 100644 --- a/contentprovider/src/main/java/com/dbflow5/provider/StubContentProvider.java +++ b/contentprovider/src/main/java/com/dbflow5/provider/StubContentProvider.java @@ -7,9 +7,7 @@ import ohos.data.rdb.ValuesBucket; import ohos.data.resultset.ResultSet; import ohos.utils.net.Uri; -/** - * Description: Used as a stub, include this in order to work around Android O changes to [ContentProvider] - */ + public class StubContentProvider { private DataAbilityHelper mDataAbilityHelper; diff --git a/core/src/main/java/com/dbflow5/MapUtils.java b/core/src/main/java/com/dbflow5/MapUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..28339249d4fdb41e4de18504cc2d43c6dfc83371 --- /dev/null +++ b/core/src/main/java/com/dbflow5/MapUtils.java @@ -0,0 +1,41 @@ +package com.dbflow5; + +import java.util.Map; +import java.util.function.Function; + +public class MapUtils { + /** + * 主要用来返回一个Map对象的对应的value, 如果没有则返回默认值并放入Map + * + * @param map 源集合 + * @param key 键 + * @param defaultValue 默认值 + * @return value + */ + public static V getOrPut(Map map, K key, V defaultValue) { + V value = map.get(key); + if(value == null){ + map.put(key, defaultValue); + value = defaultValue; + } + return value; + } + + /** + * 主要用来返回一个Map对象的对应的value, 如果没有则返回默认值并放入Map + * + * @param map 源集合 + * @param key 键 + * @param fn 操作函数 + * @return value + */ + public static V getOrPut(Map map, K key, Function fn) { + V value = map.get(key); + if(value == null){ + V answer = fn.apply(null); + map.put(key, answer); + value = answer; + } + return value; + } +} diff --git a/core/src/main/java/com/dbflow5/StringUtils.java b/core/src/main/java/com/dbflow5/StringUtils.java index 973450fd5fec3bffad45095b08cb049b9b4b7a00..740184f2f750d170115f7db9b4f32126620e1626 100644 --- a/core/src/main/java/com/dbflow5/StringUtils.java +++ b/core/src/main/java/com/dbflow5/StringUtils.java @@ -99,9 +99,9 @@ public class StringUtils{ */ public static String stripQuotes(String string){ String ret = string; - if (ret != null && isQuoted(ret)) { - ret = ret.replace("`", ""); - } +// if (ret != null && isQuoted(ret)) { +// ret = ret.replace("`", ""); +// } return ret; } diff --git a/entry/build.gradle b/entry/build.gradle index 7db1e015e2b9e4f650434eebb2fab7a8e467f400..5b6ab4dff5b5f6585c46e69847fd3e81a8662324 100644 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -41,7 +41,6 @@ dependencies { testImplementation 'org.mockito:mockito-core:3.+' ohosTestImplementation 'org.mockito:mockito-core:3.+' -// ohosTestImplementation('org.mockito:mockito-android:2.23.0') ohosTestImplementation("org.glassfish:javax.annotation:10.0-b28") } diff --git a/entry/src/main/config.json b/entry/src/main/config.json index ecc7ed728fac9cb0c16a4571dad5be011ca4575f..76c2101e7f8b1951bb5b0887c3bc2557e3947222 100644 --- a/entry/src/main/config.json +++ b/entry/src/main/config.json @@ -45,20 +45,6 @@ "type": "page", "launchType": "standard" } - ], - "reqPermissions": [ - { - "name": "ohos.dataability.TestContentProvider_Provider" - }, - { - "name": "ohos.dataability.TestContentProvider2_Provider" - }, - { - "name": "ohos.permission.READ_USER_STORAGE" - }, - { - "name": "ohos.permission.WRITE_USER_STORAGE" - } ] } } \ No newline at end of file diff --git a/entry/src/main/java/com/dbflow5/StubContentProvider.java b/entry/src/main/java/com/dbflow5/StubContentProvider.java index a3f350c617415ab09496f62e1025c89a50a0ead0..60e017b9299192a9f36b2e1bae3e108fb2b9515e 100644 --- a/entry/src/main/java/com/dbflow5/StubContentProvider.java +++ b/entry/src/main/java/com/dbflow5/StubContentProvider.java @@ -2,9 +2,7 @@ package com.dbflow5; import ohos.aafwk.ability.DataAbilityHelper; -/** - * Description: Used as a stub, include this in order to work around Android O changes to [ContentProvider] - */ + public class StubContentProvider { diff --git a/entry/src/ohosTest/config.json b/entry/src/ohosTest/config.json index 60bae813ca405ebd3a55bce20ad9816f13338cee..e17fa05a97e24790a2da49e811ce19175bbb74dd 100644 --- a/entry/src/ohosTest/config.json +++ b/entry/src/ohosTest/config.json @@ -39,10 +39,10 @@ ], "reqPermissions": [ { - "name": "ohos.dataability.TestContentProvider_Provider" + "name": "com.dbflow5.dataability.TestContentProvider" }, { - "name": "ohos.dataability.TestContentProvider2_Provider" + "name": "com.dbflow5.dataability.TestContentProvider2" }, { "name": "ohos.permission.READ_USER_STORAGE" diff --git a/entry/src/ohosTest/java/com/dbflow5/BaseUnitTest.java b/entry/src/ohosTest/java/com/dbflow5/BaseUnitTest.java index 965520a3b45e1ee8a683bb492d6e447fc79347ca..c29527eb1a8766e29dbc04ea09bddc923041cdcf 100644 --- a/entry/src/ohosTest/java/com/dbflow5/BaseUnitTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/BaseUnitTest.java @@ -16,7 +16,7 @@ public abstract class BaseUnitTest { } public final Context getContext() { - return AbilityDelegatorRegistry.getAbilityDelegator().getAppContext(); + return AbilityDelegatorRegistry.getAbilityDelegator().getCurrentTopAbility(); } } diff --git a/entry/src/ohosTest/java/com/dbflow5/SimpleModel_Table.java b/entry/src/ohosTest/java/com/dbflow5/SimpleModel_Table.java index 113b948ff0751b4c746d37782a969e4f0fc8217c..1dd56418afc654c008fa52b2ac8e7a6949df9a7c 100644 --- a/entry/src/ohosTest/java/com/dbflow5/SimpleModel_Table.java +++ b/entry/src/ohosTest/java/com/dbflow5/SimpleModel_Table.java @@ -44,7 +44,7 @@ public final class SimpleModel_Table extends ModelAdapter customListModelLoader = new ListModelLoader<>(SimpleTestModels.SimpleModel.class); SingleModelLoader singleModelLoader = new SingleModelLoader<>(SimpleTestModels.SimpleModel.class); ModelSaver modelSaver = new ModelSaver<>(); @@ -68,5 +66,4 @@ public class ConfigIntegrationTest extends BaseUnitTest { Assert.assertEquals(modelAdapter.getSingleModelLoader(), singleModelLoader); Assert.assertEquals(modelAdapter.getModelSaver(), modelSaver); } - } diff --git a/entry/src/ohosTest/java/com/dbflow5/config/ContentDatabaseContentDatabase_Database.java b/entry/src/ohosTest/java/com/dbflow5/config/ContentDatabaseContentDatabase_Database.java index 48aa14094069ddbd07063010f6295421ffbcc756..16df83dcfa340e81907e071f1f72215d6e4103ce 100644 --- a/entry/src/ohosTest/java/com/dbflow5/config/ContentDatabaseContentDatabase_Database.java +++ b/entry/src/ohosTest/java/com/dbflow5/config/ContentDatabaseContentDatabase_Database.java @@ -6,11 +6,7 @@ import com.dbflow5.provider.NoteModel_Table; import com.dbflow5.provider.TestSyncableModel_Table; import java.lang.Class; import java.lang.Override; -import javax.annotation.Generated; -/** - * This is generated code. Please do not modify */ -@Generated("com.dbflow5.processor.DBFlowProcessor") public final class ContentDatabaseContentDatabase_Database extends ContentProviderObjects.ContentDatabase { public ContentDatabaseContentDatabase_Database(DatabaseHolder holder) { addModelAdapter(new ContentProviderModel_Table(this), holder); diff --git a/entry/src/ohosTest/java/com/dbflow5/config/DatabaseConfigTest.java b/entry/src/ohosTest/java/com/dbflow5/config/DatabaseConfigTest.java index a97379bde1110ed3f0e972ec5362d692660cfae7..f276827c879d72f8b9b90e59c23f4d7a064b33e6 100644 --- a/entry/src/ohosTest/java/com/dbflow5/config/DatabaseConfigTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/config/DatabaseConfigTest.java @@ -1,5 +1,6 @@ package com.dbflow5.config; +import com.dbflow5.DemoApp; import com.dbflow5.TestDatabase; import com.dbflow5.database.*; @@ -16,7 +17,6 @@ import java.util.concurrent.atomic.AtomicReference; public class DatabaseConfigTest extends BaseUnitTest { private FlowConfig.Builder builder; - @Before public void setup() { FlowManager.reset(); FlowLog.setMinimumLoggingLevel(FlowLog.Level.V); @@ -25,6 +25,7 @@ public class DatabaseConfigTest extends BaseUnitTest { @Test public void test_databaseConfig() { + setup(); DatabaseCallback helperListener = new DatabaseCallback(){ @Override @@ -96,7 +97,7 @@ public class DatabaseConfigTest extends BaseUnitTest { DatabaseConfig.OpenHelperCreator openHelperCreator = (db, callback) -> customOpenHelper; - AtomicReference testTransactionManager = null; + AtomicReference testTransactionManager = new AtomicReference<>(); DatabaseConfig.TransactionManagerCreator managerCreator = db -> { testTransactionManager.set(new TestTransactionManager(db)); return testTransactionManager.get(); @@ -121,13 +122,14 @@ public class DatabaseConfigTest extends BaseUnitTest { Assert.assertEquals(databaseConfig.callback, helperListener); Assert.assertTrue(databaseConfig.tableConfigMap.isEmpty()); -// TestDatabase databaseDefinition = FlowManager.database(TestDatabase.class, testDatabase -> null); -// Assert.assertEquals(databaseDefinition.transactionManager, testTransactionManager.get()); -// Assert.assertEquals(databaseDefinition.openHelper(), customOpenHelper); + TestDatabase databaseDefinition = FlowManager.database(TestDatabase.class, testDatabase -> null); + Assert.assertEquals(databaseDefinition.transactionManager, testTransactionManager.get()); + Assert.assertEquals(databaseDefinition.openHelper(), customOpenHelper); } @Test public void test_EmptyName() { + builder=new FlowConfig.Builder(DemoApp.context); FlowManager.init(builder.database(TestDatabase.class, builder1 -> { builder1.databaseName("Test"); builder1.extensionName(""); diff --git a/entry/src/ohosTest/java/com/dbflow5/config/MigratedPrepackagedDBMigratedPrepackagedDB_Database.java b/entry/src/ohosTest/java/com/dbflow5/config/MigratedPrepackagedDBMigratedPrepackagedDB_Database.java index 32ab066b00a6d3e0b8749b90d1eb0d1fe1ef958c..3e3024688c4354a4356526fca806a06aa27e1236 100644 --- a/entry/src/ohosTest/java/com/dbflow5/config/MigratedPrepackagedDBMigratedPrepackagedDB_Database.java +++ b/entry/src/ohosTest/java/com/dbflow5/config/MigratedPrepackagedDBMigratedPrepackagedDB_Database.java @@ -5,11 +5,7 @@ import com.dbflow5.prepackaged.PrepackagedDB; import java.lang.Class; import java.lang.Override; -import javax.annotation.Generated; -/** - * This is generated code. Please do not modify */ -@Generated("com.dbflow5.processor.DBFlowProcessor") public final class MigratedPrepackagedDBMigratedPrepackagedDB_Database extends PrepackagedDB.MigratedPrepackagedDB { public MigratedPrepackagedDBMigratedPrepackagedDB_Database(DatabaseHolder holder) { addModelAdapter(new Dog2_Table(this), holder); diff --git a/entry/src/ohosTest/java/com/dbflow5/config/TestForeignKeyDatabaseTestForeignKeyDatabase_Database.java b/entry/src/ohosTest/java/com/dbflow5/config/TestForeignKeyDatabaseTestForeignKeyDatabase_Database.java index 887eb2124f851eba99f6fce599ea6a7562bf2034..cf3b33254c1b0abc6b6230acba987d641e67563e 100644 --- a/entry/src/ohosTest/java/com/dbflow5/config/TestForeignKeyDatabaseTestForeignKeyDatabase_Database.java +++ b/entry/src/ohosTest/java/com/dbflow5/config/TestForeignKeyDatabaseTestForeignKeyDatabase_Database.java @@ -5,11 +5,7 @@ import com.dbflow5.SimpleModel_Table; import com.dbflow5.TestForeignKeyDatabase; import java.lang.Class; import java.lang.Override; -import javax.annotation.Generated; -/** - * This is generated code. Please do not modify */ -@Generated("com.dbflow5.processor.DBFlowProcessor") public final class TestForeignKeyDatabaseTestForeignKeyDatabase_Database extends TestForeignKeyDatabase { public TestForeignKeyDatabaseTestForeignKeyDatabase_Database(DatabaseHolder holder) { addModelAdapter(new SimpleForeignModel_Table(this), holder); diff --git a/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataModel_Table.java b/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataModel_Table.java index 718eccf8c3ca2e99dce14a6d2784212b4cb71c67..8aa10dd7edc64016d3ce7ae0b3a0073a8f18b9fe 100644 --- a/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataModel_Table.java +++ b/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataModel_Table.java @@ -49,10 +49,10 @@ public final class LiveDataModel_Table extends ModelAdapter { public final Property getProperty(String columnName) { String columnName2 = StringUtils.quoteIfNeeded(columnName); switch ((columnName2)) { - case "`id`": { + case "id": { return id; } - case "`name`": { + case "name": { return name; } default: { diff --git a/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataTest.java b/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataTest.java index f9b890b05eaa570fd310891b7904592e8c4a9372..09db4b3ed492388e3163d380886fa1f185000a57 100644 --- a/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/livedata/LiveDataTest.java @@ -7,10 +7,8 @@ import com.dbflow5.database.DatabaseWrapper; import com.dbflow5.query.ModelQueriable; import com.dbflow5.query.SQLite; import com.dbflow5.structure.Model; -import ohos.aafwk.ability.Ability; -import ohos.aafwk.ability.ILifecycle; +import org.junit.Assert; import org.junit.Test; -import org.mockito.Mockito; import java.util.List; import java.util.function.Function; @@ -20,12 +18,11 @@ public class LiveDataTest extends BaseUnitTest { public void live_data_executes_for_a_few_model_queries() { LiveData> data = QueryLiveData.toLiveData(SQLite.select().from(LiveDataModel.class), ModelQueriable::queryList); -// Observer> observer = Mockito.mock(Observer.class); -// Ability ability = Mockito.mock(Ability.class); -// data.observe(ability, observer); + data.observeForever( liveDataModels -> { + }); List value = data.getValue(); - assert (value.isEmpty()); + Assert.assertTrue(value.isEmpty()); FlowManager.database(TestDatabase.class, testDatabase -> null) .beginTransactionAsync((Function) db -> { @@ -40,8 +37,8 @@ public class LiveDataTest extends BaseUnitTest { List value2 = data.getValue(); if (value2.size() != 3) { - System.out.println("expected " + value2.size() + " == 3"); + Assert.fail("expected " + value2.size() + " == 3"); } - assert (value2.size() == 3); + Assert.assertEquals(3, value2.size()); } } diff --git a/entry/src/ohosTest/java/com/dbflow5/models/Account_Table.java b/entry/src/ohosTest/java/com/dbflow5/models/Account_Table.java index 615e87f1114f8835a6ec13adf7931971f5ba3110..e6e97c0c98e777bf742940e04bf25b5ed093b9c3 100644 --- a/entry/src/ohosTest/java/com/dbflow5/models/Account_Table.java +++ b/entry/src/ohosTest/java/com/dbflow5/models/Account_Table.java @@ -67,7 +67,7 @@ public final class Account_Table extends ModelAdapter { public final Property getProperty(String columnName) { String columnName2 = StringUtils.quoteIfNeeded(columnName); switch ((columnName2)) { - case "`id`": { + case "id": { return id; } default: { diff --git a/entry/src/ohosTest/java/com/dbflow5/models/CachingModelsTest.java b/entry/src/ohosTest/java/com/dbflow5/models/CachingModelsTest.java index c672c2ac01f356d22dec8981daad0f892236d9b2..ca0553d98112c767aaa26a9ac6bcf761b281144c 100644 --- a/entry/src/ohosTest/java/com/dbflow5/models/CachingModelsTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/models/CachingModelsTest.java @@ -25,10 +25,8 @@ public class CachingModelsTest extends BaseUnitTest { list.add(simpleCacheObject); } List loadedList = SQLite.select().from(CachingModels.SimpleCacheObject.class).queryList(testDatabase); - if (loadedList.size() > 0) { - for (int i = 0; i < loadedList.size(); i++) { - Assert.assertEquals(list.get(i), loadedList.get(i)); - } + for (int i = 0; i < loadedList.size(); i++) { + Assert.assertEquals(list.get(i), loadedList.get(i)); } return null; }); diff --git a/entry/src/ohosTest/java/com/dbflow5/models/ProspectQuizEntry_Table.java b/entry/src/ohosTest/java/com/dbflow5/models/ProspectQuizEntry_Table.java index c5f1753e231590db62a6c8505b64558fd8c0a7ed..dfa7af9052fb124835dc29d4fbcc24cd5bc5efec 100644 --- a/entry/src/ohosTest/java/com/dbflow5/models/ProspectQuizEntry_Table.java +++ b/entry/src/ohosTest/java/com/dbflow5/models/ProspectQuizEntry_Table.java @@ -152,7 +152,7 @@ public final class ProspectQuizEntry_Table extends ModelAdapter { @Override public final String getCreationQuery() { - return "CREATE TABLE IF NOT EXISTS Refund(_id INTEGER PRIMARY KEY AUTOINCREMENT, refund_in_transfer_id TEXT, refund_out_transfer_id TEXT, FOREIGN KEY(refund_in_transfer_id) REFERENCES Transfer (`transfer_id`) ON UPDATE NO ACTION ON DELETE NO ACTION, FOREIGN KEY(refund_out_transfer_id) REFERENCES Transfer (`transfer_id`) ON UPDATE NO ACTION ON DELETE NO ACTION)"; + return "CREATE TABLE IF NOT EXISTS Refund(_id INTEGER PRIMARY KEY AUTOINCREMENT, refund_in_transfer_id TEXT, refund_out_transfer_id TEXT, FOREIGN KEY(refund_in_transfer_id) REFERENCES Transfer (transfer_id) ON UPDATE NO ACTION ON DELETE NO ACTION, FOREIGN KEY(refund_out_transfer_id) REFERENCES Transfer (transfer_id) ON UPDATE NO ACTION ON DELETE NO ACTION)"; } @Override diff --git a/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDB.java b/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDB.java index 353115f26ba0e170269e5dc070cc9ab0fbb6aebe..beb19b963719caac20cac206e542400ac758dbe7 100644 --- a/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDB.java +++ b/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDB.java @@ -14,13 +14,6 @@ import com.dbflow5.structure.BaseModel; import ohos.aafwk.ability.DataAbilityRemoteException; -/** - * PrepackagedDB - * - * @author wangyin - * @since 2021/06/18 - */ - @Database(version = 1) public abstract class PrepackagedDB extends DBFlowDatabase{ @@ -145,6 +138,16 @@ public abstract class PrepackagedDB extends DBFlowDatabase{ this.breed = breed; this.newField = newField; } + + @Override + public String toString() { + return "Dog2{" + + "id=" + id + + ", breed='" + breed + '\'' + + ", color='" + color + '\'' + + ", newField='" + newField + '\'' + + '}'; + } } } diff --git a/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDBTest.java b/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDBTest.java index 3e37ca32b277b653a261f358ccc02bfd3100969b..012bb9885442a6685d4a8ca2167b036c552f2edf 100644 --- a/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDBTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/prepackaged/PrepackagedDBTest.java @@ -38,7 +38,7 @@ public class PrepackagedDBTest { public void assertWeCanLoadFromDB() { FlowManager.database(PrepackagedDB.class, db -> { List list = SQLite.select().from(PrepackagedDB.Dog.class).queryList(db); - assertTrue(list.isEmpty()); + assertFalse(list.isEmpty()); return null; }); } diff --git a/entry/src/ohosTest/java/com/dbflow5/provider/ContentDatabase_Provider.java b/entry/src/ohosTest/java/com/dbflow5/provider/ContentDatabase_Provider.java index 5d304acaeb5ba06a9e541f0be44f7bce4fc25224..42ef9e5705484ade29f0c25a77ee8ad1ed8031aa 100644 --- a/entry/src/ohosTest/java/com/dbflow5/provider/ContentDatabase_Provider.java +++ b/entry/src/ohosTest/java/com/dbflow5/provider/ContentDatabase_Provider.java @@ -48,7 +48,7 @@ public final class ContentDatabase_Provider extends BaseContentProvider { String type = null; switch (MATCHER.match(uri)) { case ContentProviderModel_CONTENT_URI: { - type = "vnd.android.cursor.dir/ContentProviderModel"; + type = "vnd.ohos.cursor.dir/ContentProviderModel"; break; } default: { diff --git a/entry/src/ohosTest/java/com/dbflow5/provider/ContentProviderTests.java b/entry/src/ohosTest/java/com/dbflow5/provider/ContentProviderTests.java index fe497838157cca0301258750fd17e4b7c84a2dfa..36c274ba3fb6417f55439d66e18b6752b5368538 100644 --- a/entry/src/ohosTest/java/com/dbflow5/provider/ContentProviderTests.java +++ b/entry/src/ohosTest/java/com/dbflow5/provider/ContentProviderTests.java @@ -22,11 +22,13 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +/** + * 该单元测试类由于无法注册DataAbility组件,导致无法进行单元测试 + */ public class ContentProviderTests { @Rule public DBFlowInstrumentedTestRule dblflowTestRule; -// public ProviderTestRule contentProviderRule; - private DataAbilityHelper mockContentResolver; + private final DataAbilityHelper mockContentResolver; public ContentProviderTests() { this.dblflowTestRule = DBFlowInstrumentedTestRule.create(builder -> { @@ -36,8 +38,7 @@ public class ContentProviderTests { .database(builder1.build()).build(); return null; }); -// this.contentProviderRule = new ProviderTestRule.Builder(TestContentProvider_Provider.class, TestContentProvider.AUTHORITY).build(); - this.mockContentResolver = FlowManager.globalContentResolver; + this.mockContentResolver = DataAbilityHelper.creator(DemoApp.context); } @Before @@ -46,124 +47,142 @@ public class ContentProviderTests { } @Test - public void testContentProviderUtils() throws DataAbilityRemoteException { - ContentProviderObjects.ContentDatabase db = FlowManager.getDatabase(ContentProviderObjects.ContentDatabase.class); - new ArrayList() { - { - add(ContentProviderObjects.NoteModel.class); - add(ContentProviderObjects.ContentProviderModel.class); + public void testContentProviderUtils() { + FlowManager.database(ContentProviderObjects.ContentDatabase.class, db -> { + try{ + new ArrayList>() { + { + add(ContentProviderObjects.NoteModel.class); + add(ContentProviderObjects.ContentProviderModel.class); + } + }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); + ContentProviderObjects.ContentProviderModel contentProviderModel = new ContentProviderObjects.ContentProviderModel(); + contentProviderModel.notes = "Test"; + int id = ContentUtils.insert(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), contentProviderModel); + assertEquals(TestContentProvider.ContentProviderModel.getCONTENT_URI().toString() + "/" + contentProviderModel.id, String.valueOf(id)); + assertTrue(contentProviderModel.exists(db)); + + contentProviderModel.notes = "NewTest"; + int update = ContentUtils.update(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), contentProviderModel); + assertEquals(update, 1); + assertTrue(contentProviderModel.exists(db)); + contentProviderModel = contentProviderModel.load(db); + assert contentProviderModel != null; + assertEquals("NewTest", contentProviderModel.notes); + + ContentProviderObjects.NoteModel noteModel = new ContentProviderObjects.NoteModel(); + noteModel.note = "Test"; + noteModel.contentProviderModel = contentProviderModel; + id = ContentUtils.insert(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), noteModel); + assertEquals(TestContentProvider.NoteModel.getCONTENT_URI().toString() + "/" + noteModel.id, String.valueOf(id)); + assertTrue(noteModel.exists(db)); + + assertTrue(ContentUtils.delete(mockContentResolver, TestContentProvider.NoteModel.getCONTENT_URI(), noteModel) > 0); + assertFalse(noteModel.exists(db)); + + assertTrue(ContentUtils.delete(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), contentProviderModel) > 0); + assertFalse(contentProviderModel.exists(db)); + + new ArrayList>() { + { + add(ContentProviderObjects.NoteModel.class); + add(ContentProviderObjects.ContentProviderModel.class); + } + }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); + }catch (DataAbilityRemoteException e){ + e.printStackTrace(); } - }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); - ContentProviderObjects.ContentProviderModel contentProviderModel = new ContentProviderObjects.ContentProviderModel(); - contentProviderModel.notes = "Test"; - int id = ContentUtils.insert(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), contentProviderModel); - assertEquals(TestContentProvider.ContentProviderModel.getCONTENT_URI().toString() + "/" + contentProviderModel.id, String.valueOf(id)); - assertTrue(contentProviderModel.exists(db)); - - contentProviderModel.notes = "NewTest"; - int update = ContentUtils.update(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), contentProviderModel); - assertEquals(update, 1); - assertTrue(contentProviderModel.exists(db)); - contentProviderModel = contentProviderModel.load(db); - assert contentProviderModel != null; - assertEquals("NewTest", contentProviderModel.notes); - - ContentProviderObjects.NoteModel noteModel = new ContentProviderObjects.NoteModel(); - noteModel.note = "Test"; - noteModel.contentProviderModel = contentProviderModel; - id = ContentUtils.insert(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), noteModel); - assertEquals(TestContentProvider.NoteModel.getCONTENT_URI().toString() + "/" + noteModel.id, String.valueOf(id)); - assertTrue(noteModel.exists(db)); - - assertTrue(ContentUtils.delete(mockContentResolver, TestContentProvider.NoteModel.getCONTENT_URI(), noteModel) > 0); - assertFalse(noteModel.exists(db)); - - assertTrue(ContentUtils.delete(mockContentResolver, TestContentProvider.ContentProviderModel.getCONTENT_URI(), contentProviderModel) > 0); - assertFalse(contentProviderModel.exists(db)); - - new ArrayList() { - { - add(ContentProviderObjects.NoteModel.class); - add(ContentProviderObjects.ContentProviderModel.class); - } - }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); + return null; + }); } @Test - public void testContentProviderNative() throws DataAbilityRemoteException { - ContentProviderObjects.ContentDatabase db = FlowManager.getDatabase(ContentProviderObjects.ContentDatabase.class); - new ArrayList() { - { - add(ContentProviderObjects.NoteModel.class); - add(ContentProviderObjects.ContentProviderModel.class); + public void testContentProviderNative() { + FlowManager.database(ContentProviderObjects.ContentDatabase.class, db -> { + try { + new ArrayList>() { + { + add(ContentProviderObjects.NoteModel.class); + add(ContentProviderObjects.ContentProviderModel.class); + } + }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); + ContentProviderObjects.ContentProviderModel contentProviderModel = new ContentProviderObjects.ContentProviderModel(); + contentProviderModel.notes = "Test"; + contentProviderModel.insert(db); + assertTrue(contentProviderModel.exists(db)); + + contentProviderModel.notes = "NewTest"; + contentProviderModel.update(db); + contentProviderModel = contentProviderModel.load(db); + assert contentProviderModel != null; + assertEquals("NewTest", contentProviderModel.notes); + + ContentProviderObjects.NoteModel noteModel = new ContentProviderObjects.NoteModel(); + noteModel.note = "Test"; + noteModel.contentProviderModel = contentProviderModel; + noteModel.insert(db); + + noteModel.note = "NewTest"; + noteModel.update(db); + noteModel = noteModel.load(db); + assert noteModel != null; + assertEquals("NewTest", noteModel.note); + + assertTrue(noteModel.exists(db)); + + noteModel.delete(db); + assertFalse(noteModel.exists(db)); + + contentProviderModel.delete(db); + assertFalse(contentProviderModel.exists(db)); + + new ArrayList>() { + { + add(ContentProviderObjects.NoteModel.class); + add(ContentProviderObjects.ContentProviderModel.class); + } + }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); + }catch (Exception e){ + e.printStackTrace(); } - }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); - ContentProviderObjects.ContentProviderModel contentProviderModel = new ContentProviderObjects.ContentProviderModel(); - contentProviderModel.notes = "Test"; - contentProviderModel.insert(db); - assertTrue(contentProviderModel.exists(db)); - - contentProviderModel.notes = "NewTest"; - contentProviderModel.update(db); - contentProviderModel = contentProviderModel.load(db); - assert contentProviderModel != null; - assertEquals("NewTest", contentProviderModel.notes); - - ContentProviderObjects.NoteModel noteModel = new ContentProviderObjects.NoteModel(); - noteModel.note = "Test"; - noteModel.contentProviderModel = contentProviderModel; - noteModel.insert(db); - - noteModel.note = "NewTest"; - noteModel.update(db); - noteModel = noteModel.load(db); - assert noteModel != null; - assertEquals("NewTest", noteModel.note); - - assertTrue(noteModel.exists(db)); - - noteModel.delete(db); - assertFalse(noteModel.exists(db)); - - contentProviderModel.delete(db); - assertFalse(contentProviderModel.exists(db)); - - new ArrayList() { - { - add(ContentProviderObjects.NoteModel.class); - add(ContentProviderObjects.ContentProviderModel.class); - } - }.forEach(aClass -> delete(aClass).executeUpdateDelete(db)); + return null; + }); } @Test - public void testSyncableModel() throws DataAbilityRemoteException { - ContentProviderObjects.ContentDatabase db = FlowManager.getDatabase(ContentProviderObjects.ContentDatabase.class); - delete(ContentProviderObjects.TestSyncableModel.class).execute(db); - ContentProviderObjects.TestSyncableModel testSyncableModel= new ContentProviderObjects.TestSyncableModel(); - testSyncableModel.name="Name"; - testSyncableModel.save(db); + public void testSyncableModel() { + FlowManager.database(ContentProviderObjects.ContentDatabase.class, db -> { + try { + delete(ContentProviderObjects.TestSyncableModel.class).execute(db); + ContentProviderObjects.TestSyncableModel testSyncableModel= new ContentProviderObjects.TestSyncableModel(); + testSyncableModel.name="Name"; + testSyncableModel.save(db); - assertTrue(testSyncableModel.exists(db)); + assertTrue(testSyncableModel.exists(db)); - testSyncableModel.name = "TestName"; - testSyncableModel.update(db); - assertEquals(testSyncableModel.name, "TestName"); + testSyncableModel.name = "TestName"; + testSyncableModel.update(db); + assertEquals(testSyncableModel.name, "TestName"); - testSyncableModel =SQLite.select().from(ContentProviderObjects.TestSyncableModel.class).where().querySingle(db); + testSyncableModel =SQLite.select().from(ContentProviderObjects.TestSyncableModel.class).where().querySingle(db); - assert testSyncableModel != null; - ContentProviderObjects.TestSyncableModel fromContentProvider = new ContentProviderObjects.TestSyncableModel(); - fromContentProvider.id = testSyncableModel.id; - fromContentProvider = fromContentProvider.load(db); + assert testSyncableModel != null; + ContentProviderObjects.TestSyncableModel fromContentProvider = new ContentProviderObjects.TestSyncableModel(); + fromContentProvider.id = testSyncableModel.id; + fromContentProvider = fromContentProvider.load(db); - assert fromContentProvider != null; - assertEquals(fromContentProvider.name, testSyncableModel.name); - assertEquals(fromContentProvider.id, testSyncableModel.id); + assert fromContentProvider != null; + assertEquals(fromContentProvider.name, testSyncableModel.name); + assertEquals(fromContentProvider.id, testSyncableModel.id); - testSyncableModel.delete(db); - assertFalse(testSyncableModel.exists(db)); + testSyncableModel.delete(db); + assertFalse(testSyncableModel.exists(db)); - delete(ContentProviderObjects.TestSyncableModel.class).executeUpdateDelete(db); + delete(ContentProviderObjects.TestSyncableModel.class).executeUpdateDelete(db); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + }); } } diff --git a/entry/src/ohosTest/java/com/dbflow5/provider/NoteModel_Table.java b/entry/src/ohosTest/java/com/dbflow5/provider/NoteModel_Table.java index aa40200f7f78e5ceacb69b3d9f5ccca69edb1fb2..92d3543dc7e37141f0af218c9f068b46825f42a4 100644 --- a/entry/src/ohosTest/java/com/dbflow5/provider/NoteModel_Table.java +++ b/entry/src/ohosTest/java/com/dbflow5/provider/NoteModel_Table.java @@ -47,7 +47,7 @@ public final class NoteModel_Table extends ModelAdapter { @Override public final String getName() { - return "`NoteModel`"; + return "NoteModel"; } @Override @@ -59,16 +59,16 @@ public final class NoteModel_Table extends ModelAdapter { public final Property getProperty(String columnName) { String columnName2 = StringUtils.quoteIfNeeded(columnName); switch ((columnName2)) { - case "`id`": { + case "id": { return id; } - case "`providerModel`": { + case "providerModel": { return providerModel; } - case "`note`": { + case "note": { return note; } - case "`isOpen`": { + case "isOpen": { return isOpen; } default: { @@ -119,27 +119,27 @@ public final class NoteModel_Table extends ModelAdapter { @Override public final String getInsertStatementQuery() { - return "INSERT INTO `NoteModel`(`id`,`providerModel`,`note`,`isOpen`) VALUES (nullif(?, 0),?,?,?)"; + return "INSERT INTO NoteModel(id,providerModel,note,isOpen) VALUES (nullif(?, 0),?,?,?)"; } @Override public final String getSaveStatementQuery() { - return "INSERT OR REPLACE INTO `NoteModel`(`id`,`providerModel`,`note`,`isOpen`) VALUES (nullif(?, 0),?,?,?)"; + return "INSERT OR REPLACE INTO NoteModel(id,providerModel,note,isOpen) VALUES (nullif(?, 0),?,?,?)"; } @Override public final String getUpdateStatementQuery() { - return "UPDATE `NoteModel` SET `id`=?,`providerModel`=?,`note`=?,`isOpen`=? WHERE `id`=?"; + return "UPDATE NoteModel SET id=?,providerModel=?,note=?,isOpen=? WHERE id=?"; } @Override public final String getDeleteStatementQuery() { - return "DELETE FROM `NoteModel` WHERE `id`=?"; + return "DELETE FROM NoteModel WHERE id=?"; } @Override public final String getCreationQuery() { - return "CREATE TABLE IF NOT EXISTS `NoteModel`(`id` INTEGER PRIMARY KEY AUTOINCREMENT, `providerModel` INTEGER, `note` TEXT, `isOpen` INTEGER, FOREIGN KEY(`providerModel`) REFERENCES ContentProviderModel (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION)"; + return "CREATE TABLE IF NOT EXISTS NoteModel(id INTEGER PRIMARY KEY AUTOINCREMENT, providerModel INTEGER, note TEXT, isOpen INTEGER, FOREIGN KEY(providerModel) REFERENCES ContentProviderModel (id) ON UPDATE NO ACTION ON DELETE NO ACTION)"; } @Override @@ -183,17 +183,17 @@ public final class NoteModel_Table extends ModelAdapter { @Override public final void bindToInsertValues(ValuesBucket values, NoteModel model) { if (model.getContentProviderModel() != null) { - values.putInteger("`providerModel`", model.getContentProviderModel().getId()); + values.putInteger("providerModel", model.getContentProviderModel().getId()); } else { - values.putNull("`providerModel`"); + values.putNull("providerModel"); } - values.putString("`note`", model.getNote()); - values.putInteger("`isOpen`", model.isOpen() ? 1 : 0); + values.putString("note", model.getNote()); + values.putInteger("isOpen", model.isOpen() ? 1 : 0); } @Override public final void bindToContentValues(ValuesBucket values, NoteModel model) { - values.putLong("`id`", model.getId()); + values.putLong("id", model.getId()); bindToInsertValues(values, model); } } diff --git a/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider.java b/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider.java index b9ae85e67d9ed75fbf398414af57c49d6636fe59..260292c6aeb0452321c758123802d87275ed3d92 100644 --- a/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider.java +++ b/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider.java @@ -44,8 +44,8 @@ class TestContentProvider2{ baseContentUri = TestContentProvider.BASE_CONTENT_URI) public class TestContentProvider { - public static final String AUTHORITY = "com.dbflow5.test.provider"; - public static final String BASE_CONTENT_URI = "content://"; + public static final String AUTHORITY = "com.dbflow5.dataability"; + public static final String BASE_CONTENT_URI = "dataability://"; public static Uri buildUri(String... paths) { Uri.Builder builder = Uri.parse(BASE_CONTENT_URI + AUTHORITY).makeBuilder(); diff --git a/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider2_Provider.java b/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider2_Provider.java index 45d1c1b1eef4d234a7a025952c85378b485c5c96..3f85427f3d6e9fff94939f375c9664a9bdd5b50e 100644 --- a/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider2_Provider.java +++ b/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider2_Provider.java @@ -51,11 +51,11 @@ public final class TestContentProvider2_Provider extends BaseContentProvider { String type = null; switch(MATCHER.match(uri)) { case ContentProviderModel_CONTENT_URI: { - type = "vnd.android.cursor.dir/ContentProviderModel"; + type = "vnd.ohos.cursor.dir/ContentProviderModel"; break; } case ContentProviderModel_withId: { - type = "vnd.android.cursor.item/ContentProviderModel"; + type = "vnd.ohos.cursor.item/ContentProviderModel"; break; } default: { diff --git a/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider_Provider.java b/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider_Provider.java index 91f00684656abb651ac6d7f43ab84040b6b47981..c14d41327148534173accc74a8b3d840f50553df 100644 --- a/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider_Provider.java +++ b/entry/src/ohosTest/java/com/dbflow5/provider/TestContentProvider_Provider.java @@ -47,7 +47,7 @@ public final class TestContentProvider_Provider extends BaseContentProvider { @Override protected void onStart(Intent intent) { super.onStart(intent); - final String AUTHORITY = "com.dbflow5.test.provider"; + final String AUTHORITY = "com.dbflow5.dataability"; MATCHER.addURI(AUTHORITY, "ContentProviderModel", ContentProviderModel_CONTENT_URI); MATCHER.addURI(AUTHORITY, "ContentProviderModel/#", ContentProviderModel_withId); MATCHER.addURI(AUTHORITY, "NoteModel", NoteModel_CONTENT_URI); @@ -67,31 +67,31 @@ public final class TestContentProvider_Provider extends BaseContentProvider { String type = null; switch (MATCHER.match(uri)) { case ContentProviderModel_CONTENT_URI: { - type = "vnd.android.cursor.dir/ContentProviderModel"; + type = "vnd.ohos.cursor.dir/ContentProviderModel"; break; } case ContentProviderModel_withId: { - type = "vnd.android.cursor.item/ContentProviderModel"; + type = "vnd.ohos.cursor.item/ContentProviderModel"; break; } case NoteModel_CONTENT_URI: { - type = "vnd.android.cursor.dir/NoteModel"; + type = "vnd.ohos.cursor.dir/NoteModel"; break; } case NoteModel_withId: { - type = "vnd.android.cursor.dir/NoteModel"; + type = "vnd.ohos.cursor.dir/NoteModel"; break; } case NoteModel_fromList: { - type = "vnd.android.cursor.item/ContentProviderModel"; + type = "vnd.ohos.cursor.item/ContentProviderModel"; break; } case NoteModel_withOpenId: { - type = "vnd.android.cursor.item/ContentProviderModel"; + type = "vnd.ohos.cursor.item/ContentProviderModel"; break; } case TestSyncableModel_CONTENT_URI: { - type = "vnd.android.cursor.dir/TestSyncableModel"; + type = "vnd.ohos.cursor.dir/TestSyncableModel"; break; } default: { diff --git a/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorIteratorTest.java b/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorIteratorTest.java index d368d74d2a2c10e86e2763fa0c9c18461d2755bb..5df1a13ff15857dac939572ddbc20954461fe695 100644 --- a/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorIteratorTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorIteratorTest.java @@ -1,7 +1,6 @@ package com.dbflow5.query.list; import com.dbflow5.BaseUnitTest; -import com.dbflow5.config.DBFlowDatabase; import com.dbflow5.config.FlowManager; import com.dbflow5.database.DatabaseWrapper; import com.dbflow5.models.SimpleTestModels.SimpleModel; @@ -20,77 +19,80 @@ public class FlowCursorIteratorTest extends BaseUnitTest { public void testCanIterateFullList() { final int[] count = {0}; - DBFlowDatabase db = FlowManager.getDatabaseForTable(SimpleModel.class); - - db.beginTransactionAsync((Function) databaseWrapper -> { - for (int i = 0; i < 10; i++) { - FlowManager.getModelAdapter(SimpleModel.class).save(new SimpleModel(String.valueOf(i)), db); - } - return null; - }).success((objectTransaction, o) -> { - FlowCursorIterator iterator = SQLite.select().from(SimpleModel.class).cursorList(db).iterator(); - assertFalse(iterator.isClosed()); + FlowManager.databaseForTable(SimpleModel.class, db -> { + db.beginTransactionAsync((Function) databaseWrapper -> { + for (int i = 0; i < 10; i++) { + FlowManager.getModelAdapter(SimpleModel.class).save(new SimpleModel(String.valueOf(i)), db); + } + return null; + }).success((objectTransaction, o) -> { + FlowCursorIterator iterator = SQLite.select().from(SimpleModel.class).cursorList(db).iterator(); + assertFalse(iterator.isClosed()); - try { - iterator.forEachRemaining(simpleModel -> { - assertEquals(String.valueOf(count[0]), simpleModel.name); - count[0]++; - }); - } catch (Exception e) { - e.printStackTrace(); - } finally { try { - iterator.close(); + iterator.forEachRemaining(simpleModel -> { + assertEquals(String.valueOf(count[0]), simpleModel.name); + count[0]++; + }); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + iterator.close(); + } catch (Exception e) { + e.printStackTrace(); + } } - } - assertTrue(iterator.isClosed()); + assertTrue(iterator.isClosed()); + return null; + }).execute(null, null, null, null); return null; - }).execute(null, null, null, null); + }); } @Test public void testCanIteratePartialList() { - DBFlowDatabase db = FlowManager.getDatabaseForTable(SimpleModel.class); - - db.beginTransactionAsync((Function) databaseWrapper -> { - for (int i = 0; i < 10; i++) { - FlowManager.getModelAdapter(SimpleModel.class).save(new SimpleModel(String.valueOf(i)), db); - } - return null; - }).success((objectTransaction, o) -> { - FlowCursorIterator iterator = SQLite.select().from(SimpleModel.class).cursorList(db).iterator(2, 7); - final int[] count = {0}; + FlowManager.databaseForTable(SimpleModel.class, db -> { + db.beginTransactionAsync((Function) databaseWrapper -> { + for (int i = 0; i < 10; i++) { + FlowManager.getModelAdapter(SimpleModel.class).save(new SimpleModel(String.valueOf(i)), db); + } + return null; + }).success((objectTransaction, o) -> { + FlowCursorIterator iterator = SQLite.select().from(SimpleModel.class).cursorList(db).iterator(2, 7); + final int[] count = {0}; - iterator.forEachRemaining(simpleModel -> { - assertEquals(String.valueOf(count[0] + 2), simpleModel.name); - count[0]++; - }); - assertEquals(7, count[0]); + iterator.forEachRemaining(simpleModel -> { + assertEquals(String.valueOf(count[0] + 2), simpleModel.name); + count[0]++; + }); + assertEquals(7, count[0]); + return null; + }).execute(null, null, null, null); return null; - }).execute(null, null, null, null); + }); } @Test public void testCanSupplyBadMaximumValue() { - DBFlowDatabase db = FlowManager.getDatabaseForTable(SimpleModel.class); - - db.beginTransactionAsync((Function) databaseWrapper -> { - for (int i = 0; i < 10; i++) { - FlowManager.getModelAdapter(SimpleModel.class).save(new SimpleModel(String.valueOf(i)), db); - } - return null; - }).success((objectTransaction, o) -> { - FlowCursorIterator iterator = SQLite.select().from(SimpleModel.class).cursorList(db).iterator(2, Long.MAX_VALUE); - final int[] count = {0}; + FlowManager.databaseForTable(SimpleModel.class, db -> { + db.beginTransactionAsync((Function) databaseWrapper -> { + for (int i = 0; i < 10; i++) { + FlowManager.getModelAdapter(SimpleModel.class).save(new SimpleModel(String.valueOf(i)), db); + } + return null; + }).success((objectTransaction, o) -> { + FlowCursorIterator iterator = SQLite.select().from(SimpleModel.class).cursorList(db).iterator(2, Long.MAX_VALUE); + final int[] count = {0}; - iterator.forEachRemaining(simpleModel -> { - assertEquals(String.valueOf(count[0] + 2), simpleModel.name); - count[0]++; - }); - assertEquals(8, count[0]); + iterator.forEachRemaining(simpleModel -> { + assertEquals(String.valueOf(count[0] + 2), simpleModel.name); + count[0]++; + }); + assertEquals(8, count[0]); + return null; + }).execute(null, null, null, null); return null; - }).execute(null, null, null, null); + }); } } diff --git a/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorListTest.java b/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorListTest.java index abb80539113a5dec404f398c2b84a89674db64ef..e3f994fe66ccea9555ca02fd70d1e08066b6cc9f 100644 --- a/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorListTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/query/list/FlowCursorListTest.java @@ -81,12 +81,12 @@ public class FlowCursorListTest extends BaseUnitTest { list.refresh(); assertEquals(11, list.count()); - assertEquals(list, cursorListFound); + assertEquals(list, cursorListFound.get()); list.removeOnCursorRefreshListener(listener); list.refresh(); - assertEquals(1, count); + assertEquals(1, count.get()); return null; }); } diff --git a/entry/src/ohosTest/java/com/dbflow5/rx2/TransactionObservablesTest.java b/entry/src/ohosTest/java/com/dbflow5/rx2/TransactionObservablesTest.java index 924d465c551d29997495e16319c09c7ece991d35..fa303f5c692becf2b23363986fb4dba503089c3d 100644 --- a/entry/src/ohosTest/java/com/dbflow5/rx2/TransactionObservablesTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/rx2/TransactionObservablesTest.java @@ -12,6 +12,7 @@ import com.dbflow5.transaction.Transaction; import org.junit.Test; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -23,7 +24,7 @@ public class TransactionObservablesTest extends BaseUnitTest { @Test public void testObservableRun() { AtomicBoolean successCalled = new AtomicBoolean(false); - AtomicReference> list = null; + AtomicReference> list = new AtomicReference<>(new ArrayList<>()); Transaction.Builder builder = FlowManager.database(TestDatabase.class, testDatabase -> null).beginTransactionAsync((Function) db -> { for(int i=0;i<10;i++) { @@ -31,7 +32,6 @@ public class TransactionObservablesTest extends BaseUnitTest { } return null; }); - TransactionObservable.asSingle(builder).doAfterSuccess(o -> TransactionObservable.asSingle(FlowManager.database(TestDatabase.class, testDatabase -> null) .beginTransactionAsync(new Function>() { @Override diff --git a/entry/src/ohosTest/java/com/dbflow5/rx2/query/CursorResultSubscriberTest.java b/entry/src/ohosTest/java/com/dbflow5/rx2/query/CursorResultSubscriberTest.java index 48c37b2640d6919e9cbd94a52ae683dc49229cfa..f211ed8330b80ff073c78999eb5405464768d0b7 100644 --- a/entry/src/ohosTest/java/com/dbflow5/rx2/query/CursorResultSubscriberTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/rx2/query/CursorResultSubscriberTest.java @@ -2,6 +2,7 @@ package com.dbflow5.rx2.query; import com.dbflow5.BaseUnitTest; import com.dbflow5.config.FlowManager; +import com.dbflow5.database.DatabaseWrapper; import com.dbflow5.models.SimpleModel_Table; import com.dbflow5.models.SimpleTestModels.SimpleModel; import com.dbflow5.query.ModelQueriable; @@ -18,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiFunction; import static org.junit.Assert.assertEquals; @@ -45,7 +47,7 @@ public class CursorResultSubscriberTest extends BaseUnitTest { public void testCanObserveOnTableChangesWithModelOps() { AtomicInteger count = new AtomicInteger(); - TransactionObservable.asFlowable(SQLite.select().from(SimpleModel.class), (modelModelQueriable, db) -> modelModelQueriable.queryList(db)).subscribe(simpleModel -> { + TransactionObservable.asFlowable(SQLite.select().from(SimpleModel.class), (BiFunction, DatabaseWrapper, Object>) ModelQueriable::queryList).subscribe(simpleModel -> { count.getAndIncrement(); }); SimpleModel model = new SimpleModel("test"); @@ -53,7 +55,7 @@ public class CursorResultSubscriberTest extends BaseUnitTest { FlowManager.databaseForTable(SimpleModel.class, dbFlowDatabase -> null).executeTransactionFunc(db -> { Model.save(SimpleModel.class, model, db); Model.delete(SimpleModel.class, model, db); - return Model.insert(SimpleModel.class, model, db); + return Model.insert(SimpleModel.class,model,db); }); assertEquals(2, count.get()); } @@ -67,24 +69,27 @@ public class CursorResultSubscriberTest extends BaseUnitTest { AtomicReference> curList = new AtomicReference<>(new ArrayList<>()); - Flowable> flowable = TransactionObservable.asFlowable(SQLite.select().from(SimpleModel.class), ModelQueriable::queryList); + Flowable> flowable = TransactionObservable.asFlowable(SQLite.select().from(SimpleModel.class), new BiFunction, DatabaseWrapper, List>() { + @Override + public List apply(ModelQueriable modelModelQueriable, DatabaseWrapper databaseWrapper) { + return modelModelQueriable.queryList(databaseWrapper); + } + }); flowable.subscribe(simpleModels -> { count.getAndIncrement(); curList.set(simpleModels); }); - dbFlowDatabase.executeTransaction((ITransaction) databaseWrapper -> { - SQLite.insert(SimpleModel.class, SimpleModel_Table.name).values("test").executeInsert(databaseWrapper); - SQLite.insert(SimpleModel.class, SimpleModel_Table.name).values("test1").executeInsert(databaseWrapper); - SQLite.insert(SimpleModel.class, SimpleModel_Table.name).values("test2").executeInsert(databaseWrapper); - return null; + dbFlowDatabase.executeTransactionFunc(db -> { + SQLite.insert(SimpleModel.class, SimpleModel_Table.name).values("test").executeInsert(db); + SQLite.insert(SimpleModel.class, SimpleModel_Table.name).values("test1").executeInsert(db); + return SQLite.insert(SimpleModel.class, SimpleModel_Table.name).values("test2").executeInsert(db); }); assertEquals(3, curList.get().size()); - dbFlowDatabase.executeTransaction((ITransaction) databaseWrapper -> { + dbFlowDatabase.executeTransactionFunc(databaseWrapper -> { SimpleModel model = SQLite.select().from(SimpleModel.class).where(SimpleModel_Table.name.eq("test")).requireSingle(databaseWrapper); - Model.delete(SimpleModel.class, model, databaseWrapper); - return null; + return Model.delete(SimpleModel.class, model, databaseWrapper); }); dbFlowDatabase.tableObserver().checkForTableUpdates(); diff --git a/entry/src/ohosTest/java/com/dbflow5/rx2/query/RXFlowableTest.java b/entry/src/ohosTest/java/com/dbflow5/rx2/query/RXFlowableTest.java index 74c5100311368b77caa6ff1723e6e014259a94eb..5e806e482fc4705371418f29ddc042da0eb4e97f 100644 --- a/entry/src/ohosTest/java/com/dbflow5/rx2/query/RXFlowableTest.java +++ b/entry/src/ohosTest/java/com/dbflow5/rx2/query/RXFlowableTest.java @@ -32,8 +32,8 @@ public class RXFlowableTest extends BaseUnitTest { @Test public void testCanObserveChanges() { FlowManager.databaseForTable(SimpleModel.class, dbFlowDatabase -> { - for (int i = 0; i < 100; i++) { - FlowManager.getModelAdapter(SimpleModel.class).save(new SimpleModel(String.valueOf(i)), dbFlowDatabase); + for (int i = 0; i <= 100; i++) { + Model.save(SimpleModel.class, new SimpleModel(String.valueOf(i)), dbFlowDatabase); } AtomicReference> list = new AtomicReference<>(new ArrayList<>()); @@ -50,7 +50,7 @@ public class RXFlowableTest extends BaseUnitTest { assertEquals(50, list.get().size()); subscribe.dispose(); - Model.save(Object.class, new SimpleModel("should not trigger"), dbFlowDatabase); + Model.save(SimpleModel.class, new SimpleModel("should not trigger"), dbFlowDatabase); assertEquals(1, triggerCount.get()); return null; }); @@ -85,7 +85,7 @@ public class RXFlowableTest extends BaseUnitTest { }); assertEquals(10, list[0].size()); - assertEquals(2, calls); // 1 for initial, 1 for batch of changes + assertEquals(2, calls[0]); // 1 for initial, 1 for batch of changes return null; }); } diff --git a/entry/src/ohosTest/java/com/dbflow5/sqlcipher/CipherTestObjects.java b/entry/src/ohosTest/java/com/dbflow5/sqlcipher/CipherTestObjects.java index e34bc8f949715843ceff86e2bcf8007a6293e09a..9b8741d27a9976a703a09384488f67b2fed00d6c 100644 --- a/entry/src/ohosTest/java/com/dbflow5/sqlcipher/CipherTestObjects.java +++ b/entry/src/ohosTest/java/com/dbflow5/sqlcipher/CipherTestObjects.java @@ -2,6 +2,7 @@ package com.dbflow5.sqlcipher; import com.dbflow5.annotation.Column; import com.dbflow5.annotation.PrimaryKey; +import com.dbflow5.annotation.Table; import com.dbflow5.config.DBFlowDatabase; import com.dbflow5.database.DatabaseCallback; import com.dbflow5.structure.BaseModel; @@ -28,6 +29,7 @@ public class CipherTestObjects { cipherSecret = "dbflow-rules"; } } + @Table(database = CipherDatabase.class) public static class CipherModel extends BaseModel { @PrimaryKey public long id = 0; diff --git a/lib/src/main/java/com/dbflow5/adapter/queriable/SingleKeyCacheableListModelLoader.java b/lib/src/main/java/com/dbflow5/adapter/queriable/SingleKeyCacheableListModelLoader.java index 4a4c77bc993fb32e2292c63c06ebb66f66455d46..4c06c0e5fd889fa27faef87792e83c1fb24d3ce3 100644 --- a/lib/src/main/java/com/dbflow5/adapter/queriable/SingleKeyCacheableListModelLoader.java +++ b/lib/src/main/java/com/dbflow5/adapter/queriable/SingleKeyCacheableListModelLoader.java @@ -26,7 +26,7 @@ public class SingleKeyCacheableListModelLoader extends CacheableListModelLoad cacheValue = cacheAdapter.getCachingColumnValueFromCursor(cursor); T model = ModelCache.addOrReload(modelCache, cacheValue, cacheAdapter, modelAdapter, cursor, databaseWrapper); data.add(model); - } while (cursor.goToFirstRow()); + } while (cursor.goToNextRow()); } return data; } diff --git a/lib/src/main/java/com/dbflow5/config/DBFlowDatabase.java b/lib/src/main/java/com/dbflow5/config/DBFlowDatabase.java index 43e330ca6a3f99421bcae46691b3cd5486f81126..fd2f96e5e5f3c49135a627e5bb0c4b1ef33eaba2 100644 --- a/lib/src/main/java/com/dbflow5/config/DBFlowDatabase.java +++ b/lib/src/main/java/com/dbflow5/config/DBFlowDatabase.java @@ -1,5 +1,6 @@ package com.dbflow5.config; +import com.dbflow5.MapUtils; import com.dbflow5.adapter.ModelAdapter; import com.dbflow5.adapter.ModelViewAdapter; import com.dbflow5.adapter.RetrievalAdapter; @@ -46,18 +47,6 @@ public abstract class DBFlowDatabase implements DatabaseWrapper { }else { return WriteAheadLogging; } -// -// Automatic -> this -// else -> { -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { -// // check if low ram device -// val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager? -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && manager?.isLowRamDevice == false) { -// WriteAheadLogging -// } -// } -// Truncate -// } } } @@ -339,7 +328,7 @@ public abstract class DBFlowDatabase implements DatabaseWrapper { } protected void addMigration(int version, Migration migration) { - List list = migrationMap.getOrDefault(version, new ArrayList<>()); + List list = MapUtils.getOrPut(migrationMap, version, new ArrayList<>()); list.add(migration); } @@ -401,10 +390,12 @@ public abstract class DBFlowDatabase implements DatabaseWrapper { ModelNotifier notifier = modelNotifier; if (notifier == null) { DatabaseConfig config = FlowManager.getConfig().databaseConfigMap.get(associatedDatabaseClassFile()); - if (config.modelNotifier == null) { - notifier = DirectModelNotifier.get(); - } else { - notifier = config.modelNotifier; + if(config != null) { + if (config.modelNotifier == null) { + notifier = DirectModelNotifier.get(); + } else { + notifier = config.modelNotifier; + } } } modelNotifier = notifier; @@ -467,7 +458,7 @@ public abstract class DBFlowDatabase implements DatabaseWrapper { public abstract boolean backupEnabled(); /** - * Performs a full deletion of this database. Reopens the [AndroidSQLiteOpenHelper] as well. + * Performs a full deletion of this database. Reopens the [OhosSQLiteOpenHelper] as well. * * Reapplies the [DatabaseConfig] if we have one. * @param databaseConfig sets a new [DatabaseConfig] on this class. diff --git a/lib/src/main/java/com/dbflow5/config/FlowManager.java b/lib/src/main/java/com/dbflow5/config/FlowManager.java index f3ea0b03f106146b5ff2dc528a86dacf11c74bb2..c7e844c91ccf74db28805c470ee5bdbe3bf4b894 100644 --- a/lib/src/main/java/com/dbflow5/config/FlowManager.java +++ b/lib/src/main/java/com/dbflow5/config/FlowManager.java @@ -252,7 +252,6 @@ public class FlowManager { for(DBFlowDatabase database : flowDatabases){ database.reset(database.databaseConfig); } - globalDatabaseHolder.reset(); loadedModules.clear(); } @@ -412,7 +411,7 @@ public class FlowManager { } public static ModelNotifier getModelNotifierForTable(Class table) { - return getDatabaseForTable(table).getModelNotifier(); + return getDatabaseForTable(table).getModelNotifier(); } public static TableNotifierRegister newRegisterForTable(Class table) { diff --git a/lib/src/main/java/com/dbflow5/database/DatabaseStatement.java b/lib/src/main/java/com/dbflow5/database/DatabaseStatement.java index 9bccfda230b5661f68b9887434d7945922841e41..a11e9aae738b96c4bd400988ab73d5f68e54687f 100644 --- a/lib/src/main/java/com/dbflow5/database/DatabaseStatement.java +++ b/lib/src/main/java/com/dbflow5/database/DatabaseStatement.java @@ -3,7 +3,7 @@ package com.dbflow5.database; import java.io.Closeable; /** - * Description: Abstracts out an Android SQLiteStatement. + * Description: Abstracts out an Ohos SQLiteStatement. */ public interface DatabaseStatement extends Closeable { diff --git a/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelper.java b/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelper.java index 793100cc2df04f4a272707e3ece007a3ae740577..c04830e32c0c14a8b84b24b13662b4db6376b1fe 100644 --- a/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelper.java +++ b/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelper.java @@ -1,5 +1,6 @@ package com.dbflow5.database; +import com.dbflow5.MapUtils; import com.dbflow5.adapter.CreationAdapter; import com.dbflow5.config.DBFlowDatabase; import com.dbflow5.config.FlowLog; @@ -41,7 +42,7 @@ public class LocalDatabaseHelper { // execute any initial migrations when DB is first created. // use the databaseversion of the definition, since onupgrade is not called oncreate on a version 0 - // then SQLCipher and Android set the DB to that version you choose. + // then SQLCipher and Ohos set the DB to that version you choose. executeMigrations(db, -1, databaseDefinition.databaseVersion()); // views reflect current db state. @@ -130,7 +131,7 @@ public class LocalDatabaseHelper { for (String file : files) { try { int version = Integer.parseInt(file.replace(".sql", "")); - List fileList = migrationFileMap.getOrDefault(version, new ArrayList<>()); + List fileList = MapUtils.getOrPut(migrationFileMap, version, new ArrayList<>()); fileList.add(file); } catch (NumberFormatException e) { FlowLog.log(FlowLog.Level.W, "Skipping invalidly named file: "+file, e); diff --git a/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelperDelegate.java b/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelperDelegate.java index d0f85fe67339642996d895160a07854db4d51d17..64f61ae567c8de33c6057ea5d11b8928fdf458c7 100644 --- a/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelperDelegate.java +++ b/lib/src/main/java/com/dbflow5/database/LocalDatabaseHelperDelegate.java @@ -10,7 +10,7 @@ import java.io.*; import java.util.function.Function; /** - * Description: An abstraction from some parts of the Android SQLiteOpenHelper where this can be + * Description: An abstraction from some parts of the Ohos SQLiteOpenHelper where this can be * used in other helper class definitions. */ public class LocalDatabaseHelperDelegate extends LocalDatabaseHelper implements OpenHelperDelegate { diff --git a/lib/src/main/java/com/dbflow5/database/OhosDatabase.java b/lib/src/main/java/com/dbflow5/database/OhosDatabase.java index b5d9af8689d417b8a7ba54c332964d488890835e..0c01656234776f8124a366b5a42f21f2fa9960c2 100644 --- a/lib/src/main/java/com/dbflow5/database/OhosDatabase.java +++ b/lib/src/main/java/com/dbflow5/database/OhosDatabase.java @@ -1,10 +1,11 @@ package com.dbflow5.database; import ohos.data.rdb.*; + import java.util.function.Function; /** - * Description: Specifies the android default implementation of a database. + * Description: Specifies the ohos default implementation of a database. */ public class OhosDatabase implements OhosDatabaseWrapper { RdbStore database; @@ -23,7 +24,8 @@ public class OhosDatabase implements OhosDatabaseWrapper { @Override public boolean isInTransaction(){ - return database.isInTransaction(); + //return database.isInTransaction(); + return false; } @Override @@ -33,7 +35,6 @@ public class OhosDatabase implements OhosDatabaseWrapper { @Override public void setTransactionSuccessful() { - //database.setTransactionSuccessful(); } @Override diff --git a/lib/src/main/java/com/dbflow5/database/OhosMigrationFileHelper.java b/lib/src/main/java/com/dbflow5/database/OhosMigrationFileHelper.java index 6af282c54f6c064537bfeeffcc7c60ab79f578d8..d2a06baaacaf25ff37b1d9635e85c0a358c8f4e4 100644 --- a/lib/src/main/java/com/dbflow5/database/OhosMigrationFileHelper.java +++ b/lib/src/main/java/com/dbflow5/database/OhosMigrationFileHelper.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.function.Function; /** - * Description: Implements [MigrationFileHelper] for Android targets. + * Description: Implements [MigrationFileHelper] for Ohos targets. */ public class OhosMigrationFileHelper implements MigrationFileHelper { private final Context context; diff --git a/lib/src/main/java/com/dbflow5/observing/TableObserver.java b/lib/src/main/java/com/dbflow5/observing/TableObserver.java index 3f02c5bf1c3eb445da95b0dc6157280bd62c0b5f..c8767d0684c08f4772236cc9fc888b6d7e8b6f86 100644 --- a/lib/src/main/java/com/dbflow5/observing/TableObserver.java +++ b/lib/src/main/java/com/dbflow5/observing/TableObserver.java @@ -29,15 +29,15 @@ public class TableObserver { private static final String SELECT_UPDATED_TABLES_SQL = "SELECT * FROM " + TABLE_OBSERVER_NAME + " WHERE " + INVALIDATED_COLUMN_NAME + " = 1;"; private final DBFlowDatabase db; - private List> tables; + private final List> tables; public TableObserver(DBFlowDatabase db, List> tables) { this.db = db; this.tables = tables; - init(); observingTableTracker = new ObservingTableTracker(tables.size()); tableStatus = new boolean[tables.size()]; + init(); } private final Map, Integer> tableReferenceMap = new HashMap<>(); @@ -76,7 +76,6 @@ public class TableObserver { throw new IllegalArgumentException("No Table found for " + table); } } - OnTableChangedObserver.OnTableChangedObserverWithIds wrapped = new OnTableChangedObserver.OnTableChangedObserverWithIds(observer, newTableIds); synchronized (observerToObserverWithIdsMap) { if (!observerToObserverWithIdsMap.containsKey(observer)) { @@ -108,7 +107,7 @@ public class TableObserver { if (databaseWrapper == db) { checkForTableUpdates((DBFlowDatabase)databaseWrapper); } else { - throw new RuntimeException("Invalid DB object passed. Must be a "+DBFlowDatabase.class+""); + throw new RuntimeException("Invalid DB object passed. Must be a " + DBFlowDatabase.class); } return null; }); @@ -221,11 +220,10 @@ public class TableObserver { } if (db.isInTransaction()) { - return; + //return; } hasUpdatedTable = checkUpdatedTables(); - } catch (Exception e) { if (e instanceof IllegalStateException || e instanceof SQLiteException) { FlowLog.log(FlowLog.Level.E, "Cannot check for table updates. is the db closed?", e); @@ -286,6 +284,6 @@ public class TableObserver { private String getTriggerName(Class table, String method) { String str = StringUtils.stripQuotes(FlowManager.getTableName(table)); - return "`" + TRIGGER_PREFIX + "_" + str + "_" + method + "`"; + return "" + TRIGGER_PREFIX + "_" + str + "_" + method + ""; } } \ No newline at end of file diff --git a/lib/src/main/java/com/dbflow5/query/From.java b/lib/src/main/java/com/dbflow5/query/From.java index d0efdd46947906bb9e0a4a0c7538eb61ff663a96..70dd59501163a4c4752ef38fe788d29167fc75e3 100644 --- a/lib/src/main/java/com/dbflow5/query/From.java +++ b/lib/src/main/java/com/dbflow5/query/From.java @@ -251,7 +251,7 @@ public class From extends BaseTransformable{ @Override public Class table() { - return table; + return super.table(); } } diff --git a/lib/src/main/java/com/dbflow5/query/Transformable.java b/lib/src/main/java/com/dbflow5/query/Transformable.java index a878e1cc13984de9510e45128c3e350c9db64809..4fe59e153368c0a41be2953d99a5ce91adf65ff2 100644 --- a/lib/src/main/java/com/dbflow5/query/Transformable.java +++ b/lib/src/main/java/com/dbflow5/query/Transformable.java @@ -43,17 +43,4 @@ public interface Transformable { } return tr.offset(offset).limit(limit); } - -// - default Where groupBy(NameAlias nameAlias) { - return groupBy(nameAlias); - } - - default Where groupBy(IProperty property) { - return groupBy(property); - } - - default Where having(SQLOperator sqlOperator) { - return having(sqlOperator); - } } diff --git a/lib/src/main/java/com/dbflow5/query/Where.java b/lib/src/main/java/com/dbflow5/query/Where.java index d29864c22f8262b7138dcea61e7065cc49c2c1e5..1e7e619b4f15df0065fca92fd171c204811b0fb0 100644 --- a/lib/src/main/java/com/dbflow5/query/Where.java +++ b/lib/src/main/java/com/dbflow5/query/Where.java @@ -238,7 +238,7 @@ public class Where extends BaseModelQueriable implements ModelQueriable @Override public Class table() { - return null; + return table; } private void checkSelect(String methodName) { diff --git a/lib/src/main/java/com/dbflow5/query/cache/ModelLruCache.java b/lib/src/main/java/com/dbflow5/query/cache/ModelLruCache.java index bb3d3c8eed92bd259faab6a3a2bbf36447d41227..a5e50602adf07f1fa02e92e4cc18e737dc8a53d8 100644 --- a/lib/src/main/java/com/dbflow5/query/cache/ModelLruCache.java +++ b/lib/src/main/java/com/dbflow5/query/cache/ModelLruCache.java @@ -5,7 +5,7 @@ import com.dbflow5.annotation.Table; import java.util.function.Function; /** - * Description: Provides an [android.util.LruCache] under its hood + * Description: Provides an [LruCache] under its hood * and provides synchronization mechanisms. */ public class ModelLruCache extends ModelCache> { diff --git a/lib/src/main/java/com/dbflow5/query/cache/SparseArrayBasedCache.java b/lib/src/main/java/com/dbflow5/query/cache/SparseArrayBasedCache.java index c20343f403895d0d3a85462f9d7e742da0a246d5..1e06c12d7fac2bee88b2eee8e36ed061dac90259 100644 --- a/lib/src/main/java/com/dbflow5/query/cache/SparseArrayBasedCache.java +++ b/lib/src/main/java/com/dbflow5/query/cache/SparseArrayBasedCache.java @@ -4,7 +4,7 @@ import com.dbflow5.config.FlowLog; import ohos.utils.PlainArray; /** - * Description: A cache backed by a [ohos.utils.PlainArray] + * Description: A cache backed by a [PlainArray] */ public class SparseArrayBasedCache extends ModelCache> { diff --git a/lib/src/main/java/com/dbflow5/runtime/NotifyDistributor.java b/lib/src/main/java/com/dbflow5/runtime/NotifyDistributor.java index f430a684df3043c572c2af8428ec1fc7c6e3058a..22822c7a22787e666dfd7cdbbeefdc5e325e5a2b 100644 --- a/lib/src/main/java/com/dbflow5/runtime/NotifyDistributor.java +++ b/lib/src/main/java/com/dbflow5/runtime/NotifyDistributor.java @@ -22,11 +22,17 @@ public class NotifyDistributor implements ModelNotifier { @Override public void notifyModelChanged(T model, ModelAdapter adapter, ChangeAction action) { - FlowManager.getModelNotifierForTable(adapter.table()).notifyModelChanged(model, adapter, action); + ModelNotifier modelNotifier = FlowManager.getModelNotifierForTable(adapter.table()); + if(modelNotifier != null) { + modelNotifier.notifyModelChanged(model, adapter, action); + } } @Override public void notifyTableChanged(Class table, ChangeAction action) { - FlowManager.getModelNotifierForTable(table).notifyTableChanged(table, action); + ModelNotifier modelNotifier = FlowManager.getModelNotifierForTable(table); + if(modelNotifier != null) { + modelNotifier.notifyTableChanged(table, action); + } } } diff --git a/lib/src/main/java/com/dbflow5/structure/ChangeAction.java b/lib/src/main/java/com/dbflow5/structure/ChangeAction.java index 66d2f770856052470d8becdc029d6497d717ce9a..ae7b45619746d6d0e1201c5444f4da9f88ed0f30 100644 --- a/lib/src/main/java/com/dbflow5/structure/ChangeAction.java +++ b/lib/src/main/java/com/dbflow5/structure/ChangeAction.java @@ -7,9 +7,5 @@ public enum ChangeAction { INSERT, UPDATE, DELETE, - /** - * The model was changed. used in prior to Android JellyBean and in generic change - * actions like [com.dbflow5.query.StringQuery] - */ CHANGE } \ No newline at end of file diff --git a/lib/src/main/java/com/dbflow5/transaction/ITransaction.java b/lib/src/main/java/com/dbflow5/transaction/ITransaction.java index 0c1f452446d453cb6d8ab77a627fb0077a202f5c..0e260e6d51f5e7a418068248967f5809eec36eb0 100644 --- a/lib/src/main/java/com/dbflow5/transaction/ITransaction.java +++ b/lib/src/main/java/com/dbflow5/transaction/ITransaction.java @@ -12,7 +12,7 @@ public interface ITransaction { * Called within a database transaction. * * @param databaseWrapper The database to save data into. Use this access to operate on the DB - * without causing an Android SQLiteDatabaseLockedException or other problems due to locking. + * without causing an Ohos SQLiteDatabaseLockedException or other problems due to locking. * @return */ R execute(DatabaseWrapper databaseWrapper); diff --git a/lib/src/main/java/com/dbflow5/transaction/Transaction.java b/lib/src/main/java/com/dbflow5/transaction/Transaction.java index fce9bc89cb4d0459f3a6af65ec6b22f489a68aa9..75f9f6207813e2885d352d82f0ed246e9eb20e12 100644 --- a/lib/src/main/java/com/dbflow5/transaction/Transaction.java +++ b/lib/src/main/java/com/dbflow5/transaction/Transaction.java @@ -279,10 +279,7 @@ public class Transaction { this.error(error); this.completion(completion); - Transaction transaction = build(); - - return transaction.execute(); - + return build().execute(); } } diff --git a/livedata/src/main/java/com/dbflow5/livedata/LiveData.java b/livedata/src/main/java/com/dbflow5/livedata/LiveData.java index 0792d014b32a327d39635815433d03a1250e2603..4511680a0cb629370f5aa8a6dff892b4c8ea151d 100644 --- a/livedata/src/main/java/com/dbflow5/livedata/LiveData.java +++ b/livedata/src/main/java/com/dbflow5/livedata/LiveData.java @@ -4,72 +4,60 @@ import ohos.aafwk.ability.ILifecycle; import ohos.aafwk.ability.Lifecycle; import ohos.aafwk.ability.LifecycleStateObserver; import ohos.aafwk.content.Intent; +import ohos.eventhandler.EventHandler; +import ohos.eventhandler.EventRunner; +import java.util.Iterator; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -/** - * 模拟实现原库的LiveData功能 - */ -public class LiveData implements ILiveData { +public abstract class LiveData { + final Object mDataLock = new Object(); + static final int START_VERSION = -1; + static final Object NOT_SET = new Object(); - private int mActiveCount = 0; - private boolean mDispatchingValue; - private boolean mDispatchInvalidated; + private final SafeIterableMap, ObserverWrapper> mObservers = new SafeIterableMap<>(); + + int mActiveCount = 0; private volatile Object mData; - static final Object NOT_SET = new Object(); + volatile Object mPendingData = NOT_SET; private int mVersion; - static final int START_VERSION = -1; - private final Map, LifecycleBoundObserver> mObservers = new ConcurrentHashMap, LifecycleBoundObserver>(); - public LiveData() { - mData = NOT_SET; - mVersion = START_VERSION; - } + private boolean mDispatchingValue; + @SuppressWarnings("FieldCanBeLocal") + private boolean mDispatchInvalidated; + private final Runnable mPostValueRunnable = () -> { + Object newValue; + synchronized (mDataLock) { + newValue = mPendingData; + mPendingData = NOT_SET; + } + setValue((T) newValue); + }; public LiveData(T value) { mData = value; mVersion = START_VERSION + 1; } - public void observe(ILifecycle owner, Observer observer) { - if (owner.getLifecycle().getLifecycleState() == Lifecycle.Event.ON_STOP) { - return; - } - LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); - if (mObservers.containsKey(observer)) { - LifecycleBoundObserver existing = mObservers.get(observer); - if (!existing.isAttachedTo(owner)) { - throw new IllegalArgumentException("Cannot add the same observer with different lifecycles"); - } - } else { - mObservers.put(observer, wrapper); - owner.getLifecycle().addObserver(wrapper); - } - + public LiveData() { + mData = NOT_SET; + mVersion = START_VERSION; } - public T getValue() { - Object data = mData; - if (data != NOT_SET) { - return (T) data; + @SuppressWarnings("unchecked") + private void considerNotify(ObserverWrapper observer) { + if (!observer.mActive) { + return; } - return null; - } - - protected void setValue(T value) { - mVersion++; - mData = value; - dispatchingValue(null); - } - - public void removeObserver(final Observer observer) { - ObserverWrapper removed = mObservers.remove(observer); - if (removed == null) { + if (!observer.shouldBeActive()) { + observer.activeStateChanged(false); return; } - removed.detachObserver(); - removed.activeStateChanged(false); + if (observer.mLastVersion >= mVersion) { + return; + } + observer.mLastVersion = mVersion; + observer.mObserver.onChanged((T) mData); } void dispatchingValue(ObserverWrapper initiator) { @@ -84,8 +72,9 @@ public class LiveData implements ILiveData { considerNotify(initiator); initiator = null; } else { - for (ObserverWrapper wrapper : mObservers.values()) { - considerNotify(wrapper); + for (Iterator, ObserverWrapper>> iterator = + mObservers.iteratorWithAdditions(); iterator.hasNext(); ) { + considerNotify(iterator.next().getValue()); if (mDispatchInvalidated) { break; } @@ -95,41 +84,146 @@ public class LiveData implements ILiveData { mDispatchingValue = false; } - private void considerNotify(ObserverWrapper observer) { - if (!observer.mActive) { + public void observe(@NonNull ILifecycle owner, @NonNull Observer observer) { + assertMainThread("observe"); + if (owner.getLifecycle().getLifecycleState() == Lifecycle.Event.ON_STOP) { return; } - if (!observer.shouldBeActive()) { - observer.activeStateChanged(false); + LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); + ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); + if (existing != null && !existing.isAttachedTo(owner)) { + throw new IllegalArgumentException("Cannot add the same observer" + + " with different lifecycles"); + } + if (existing != null) { return; } - if (observer.mLastVersion >= mVersion) { + owner.getLifecycle().addObserver(wrapper); + } + + public void observeForever(@NonNull Observer observer) { + assertMainThread("observeForever"); + AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer); + ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); + if (existing instanceof LiveData.LifecycleBoundObserver) { + throw new IllegalArgumentException("Cannot add the same observer" + + " with different lifecycles"); + } + if (existing != null) { return; } - observer.mLastVersion = mVersion; - //noinspection unchecked - observer.mObserver.onChanged((T) mData); + wrapper.activeStateChanged(true); + } + + public void removeObserver(@NonNull final Observer observer) { + assertMainThread("removeObserver"); + ObserverWrapper removed = mObservers.remove(observer); + if (removed == null) { + return; + } + removed.detachObserver(); + removed.activeStateChanged(false); + } + + public void removeObservers(@NonNull final ILifecycle owner) { + assertMainThread("removeObservers"); + for (Map.Entry, ObserverWrapper> entry : mObservers) { + if (entry.getValue().isAttachedTo(owner)) { + removeObserver(entry.getKey()); + } + } + } + + protected void postValue(T value) { + boolean postTask; + synchronized (mDataLock) { + postTask = mPendingData == NOT_SET; + mPendingData = value; + } + if (!postTask) { + return; + } + EventRunner.getMainEventRunner(); + new EventHandler(EventRunner.getMainEventRunner()).postTask(mPostValueRunnable); + + } + + protected void setValue(T value) { + assertMainThread("setValue"); + mVersion++; + mData = value; + dispatchingValue(null); + } + + public T getValue() { + Object data = mData; + if (data != NOT_SET) { + return (T) data; + } + return null; + } + + int getVersion() { + return mVersion; } - /** - * 激活函数 - */ protected void onActive() { + } - /** - * 取消激活函数 - */ protected void onInactive() { + + } + + public boolean hasObservers() { + return mObservers.size() > 0; + } + + public boolean hasActiveObservers() { + return mActiveCount > 0; + } + + class LifecycleBoundObserver extends ObserverWrapper implements LifecycleStateObserver { + @NonNull + final ILifecycle mOwner; + + LifecycleBoundObserver(@NonNull ILifecycle owner, Observer observer) { + super(observer); + mOwner = owner; + } + + @Override + boolean shouldBeActive() { + return mOwner.getLifecycle().getLifecycleState().compareTo(Lifecycle.Event.ON_INACTIVE) >= 0; + } + + @Override + public void onStateChanged(Lifecycle.Event event, Intent intent) { + if (mOwner.getLifecycle().getLifecycleState() == Lifecycle.Event.ON_STOP) { + removeObserver(mObserver); + return; + } + activeStateChanged(shouldBeActive()); + } + + @Override + boolean isAttachedTo(ILifecycle owner) { + return mOwner == owner; + } + + @Override + void detachObserver() { + mOwner.getLifecycle().removeObserver(this); + } } - abstract class ObserverWrapper { + private abstract class ObserverWrapper { final Observer mObserver; boolean mActive; int mLastVersion = START_VERSION; - protected ObserverWrapper(Observer mObserver) { - this.mObserver = mObserver; + ObserverWrapper(Observer observer) { + mObserver = observer; } abstract boolean shouldBeActive(); @@ -147,12 +241,12 @@ public class LiveData implements ILiveData { } mActive = newActive; - boolean wasInactive = mActiveCount == 0; - mActiveCount += mActive ? 1 : -1; + boolean wasInactive = LiveData.this.mActiveCount == 0; + LiveData.this.mActiveCount += mActive ? 1 : -1; if (wasInactive && mActive) { onActive(); } - if (mActiveCount == 0 && !mActive) { + if (LiveData.this.mActiveCount == 0 && !mActive) { onInactive(); } if (mActive) { @@ -161,36 +255,21 @@ public class LiveData implements ILiveData { } } - class LifecycleBoundObserver extends ObserverWrapper implements LifecycleStateObserver { - ILifecycle mOwner; - - public LifecycleBoundObserver(ILifecycle owner, Observer observer) { + private class AlwaysActiveObserver extends ObserverWrapper { + AlwaysActiveObserver(Observer observer) { super(observer); - mOwner = owner; } @Override boolean shouldBeActive() { - return mOwner.getLifecycle().getLifecycleState().compareTo(Lifecycle.Event.ON_INACTIVE) >= 0; - } - - @Override - boolean isAttachedTo(ILifecycle owner) { - return mOwner == owner; - } - - @Override - void detachObserver() { - mOwner.getLifecycle().removeObserver(this); + return true; } + } - @Override - public void onStateChanged(Lifecycle.Event event, Intent intent) { - if (mOwner.getLifecycle().getLifecycleState() == Lifecycle.Event.ON_STOP) { - removeObserver(mObserver); - return; - } - activeStateChanged(shouldBeActive()); + static void assertMainThread(String methodName) { + if (EventRunner.getMainEventRunner().getThreadId() != Thread.currentThread().getId()) { +// throw new IllegalStateException("Cannot invoke " + methodName + " on a background" +// + " thread"); } } } diff --git a/livedata/src/main/java/com/dbflow5/livedata/NonNull.java b/livedata/src/main/java/com/dbflow5/livedata/NonNull.java new file mode 100644 index 0000000000000000000000000000000000000000..b6f87f3a8c472142b123d6790e8a88e3a2130019 --- /dev/null +++ b/livedata/src/main/java/com/dbflow5/livedata/NonNull.java @@ -0,0 +1,15 @@ +package com.dbflow5.livedata; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.ElementType.PACKAGE; +import static java.lang.annotation.RetentionPolicy.CLASS; + +@Documented +@Retention(CLASS) +@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE}) +public @interface NonNull { +} \ No newline at end of file diff --git a/livedata/src/main/java/com/dbflow5/livedata/QueryLiveData.java b/livedata/src/main/java/com/dbflow5/livedata/QueryLiveData.java index 36511699016f9387b732881f5edc3f8f04c7192c..06b646f5354eecc4e75a7b2df3ede5de6a000cb7 100644 --- a/livedata/src/main/java/com/dbflow5/livedata/QueryLiveData.java +++ b/livedata/src/main/java/com/dbflow5/livedata/QueryLiveData.java @@ -46,12 +46,7 @@ public class QueryLiveData extends LiveData{ table = modelQueriable.table(); } FlowManager.databaseForTable(table, db -> null) - .beginTransactionAsync(new Function() { - @Override - public R apply(DatabaseWrapper databaseWrapper) { - return evalFn.apply(modelQueriable, databaseWrapper); - } - }).execute(null, null, null, (rTransaction, r) -> { + .beginTransactionAsync((Function) databaseWrapper -> evalFn.apply(modelQueriable, databaseWrapper)).execute(null, null, null, (rTransaction, r) -> { setValue(r); return null; }); diff --git a/livedata/src/main/java/com/dbflow5/livedata/SafeIterableMap.java b/livedata/src/main/java/com/dbflow5/livedata/SafeIterableMap.java new file mode 100644 index 0000000000000000000000000000000000000000..0e50456792894c624c96d2692a2356c7d646c7a9 --- /dev/null +++ b/livedata/src/main/java/com/dbflow5/livedata/SafeIterableMap.java @@ -0,0 +1,340 @@ +package com.dbflow5.livedata; + +import java.util.Iterator; +import java.util.Map; +import java.util.WeakHashMap; + +public class SafeIterableMap implements Iterable> { + + Entry mStart; + private Entry mEnd; + private WeakHashMap, Boolean> mIterators = new WeakHashMap<>(); + private int mSize = 0; + + protected Entry get(K k) { + Entry currentNode = mStart; + while (currentNode != null) { + if (currentNode.mKey.equals(k)) { + break; + } + currentNode = currentNode.mNext; + } + return currentNode; + } + + public V putIfAbsent(@NonNull K key, @NonNull V v) { + Entry entry = get(key); + if (entry != null) { + return entry.mValue; + } + put(key, v); + return null; + } + + protected Entry put(@NonNull K key, @NonNull V v) { + Entry newEntry = new Entry<>(key, v); + mSize++; + if (mEnd == null) { + mStart = newEntry; + mEnd = mStart; + return newEntry; + } + + mEnd.mNext = newEntry; + newEntry.mPrevious = mEnd; + mEnd = newEntry; + return newEntry; + + } + + public V remove(@NonNull K key) { + Entry toRemove = get(key); + if (toRemove == null) { + return null; + } + mSize--; + if (!mIterators.isEmpty()) { + for (SupportRemove iter : mIterators.keySet()) { + iter.supportRemove(toRemove); + } + } + + if (toRemove.mPrevious != null) { + toRemove.mPrevious.mNext = toRemove.mNext; + } else { + mStart = toRemove.mNext; + } + + if (toRemove.mNext != null) { + toRemove.mNext.mPrevious = toRemove.mPrevious; + } else { + mEnd = toRemove.mPrevious; + } + + toRemove.mNext = null; + toRemove.mPrevious = null; + return toRemove.mValue; + } + + public int size() { + return mSize; + } + + @NonNull + @Override + public Iterator> iterator() { + ListIterator iterator = new AscendingIterator<>(mStart, mEnd); + mIterators.put(iterator, false); + return iterator; + } + + public Iterator> descendingIterator() { + DescendingIterator iterator = new DescendingIterator<>(mEnd, mStart); + mIterators.put(iterator, false); + return iterator; + } + + public IteratorWithAdditions iteratorWithAdditions() { + @SuppressWarnings("unchecked") + IteratorWithAdditions iterator = new IteratorWithAdditions(); + mIterators.put(iterator, false); + return iterator; + } + + public Map.Entry eldest() { + return mStart; + } + + public Map.Entry newest() { + return mEnd; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof SafeIterableMap)) { + return false; + } + SafeIterableMap map = (SafeIterableMap) obj; + if (this.size() != map.size()) { + return false; + } + Iterator> iterator1 = iterator(); + Iterator iterator2 = map.iterator(); + while (iterator1.hasNext() && iterator2.hasNext()) { + Map.Entry next1 = iterator1.next(); + Object next2 = iterator2.next(); + if ((next1 == null && next2 != null) + || (next1 != null && !next1.equals(next2))) { + return false; + } + } + return !iterator1.hasNext() && !iterator2.hasNext(); + } + + @Override + public int hashCode() { + int h = 0; + Iterator> i = iterator(); + while (i.hasNext()) { + h += i.next().hashCode(); + } + return h; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("["); + Iterator> iterator = iterator(); + while (iterator.hasNext()) { + builder.append(iterator.next().toString()); + if (iterator.hasNext()) { + builder.append(", "); + } + } + builder.append("]"); + return builder.toString(); + } + + private abstract static class ListIterator implements Iterator>, + SupportRemove { + Entry mExpectedEnd; + Entry mNext; + + ListIterator(Entry start, Entry expectedEnd) { + this.mExpectedEnd = expectedEnd; + this.mNext = start; + } + + @Override + public boolean hasNext() { + return mNext != null; + } + + @SuppressWarnings("ReferenceEquality") + @Override + public void supportRemove(@NonNull Entry entry) { + if (mExpectedEnd == entry && entry == mNext) { + mNext = null; + mExpectedEnd = null; + } + + if (mExpectedEnd == entry) { + mExpectedEnd = backward(mExpectedEnd); + } + + if (mNext == entry) { + mNext = nextNode(); + } + } + + @SuppressWarnings("ReferenceEquality") + private Entry nextNode() { + if (mNext == mExpectedEnd || mExpectedEnd == null) { + return null; + } + return forward(mNext); + } + + @Override + public Map.Entry next() { + Map.Entry result = mNext; + mNext = nextNode(); + return result; + } + + abstract Entry forward(Entry entry); + + abstract Entry backward(Entry entry); + } + + static class AscendingIterator extends ListIterator { + AscendingIterator(Entry start, Entry expectedEnd) { + super(start, expectedEnd); + } + + @Override + Entry forward(Entry entry) { + return entry.mNext; + } + + @Override + Entry backward(Entry entry) { + return entry.mPrevious; + } + } + + private static class DescendingIterator extends ListIterator { + + DescendingIterator(Entry start, Entry expectedEnd) { + super(start, expectedEnd); + } + + @Override + Entry forward(Entry entry) { + return entry.mPrevious; + } + + @Override + Entry backward(Entry entry) { + return entry.mNext; + } + } + + private class IteratorWithAdditions implements Iterator>, SupportRemove { + private Entry mCurrent; + private boolean mBeforeStart = true; + + IteratorWithAdditions() { + } + + @SuppressWarnings("ReferenceEquality") + @Override + public void supportRemove(@NonNull Entry entry) { + if (entry == mCurrent) { + mCurrent = mCurrent.mPrevious; + mBeforeStart = mCurrent == null; + } + } + + @Override + public boolean hasNext() { + if (mBeforeStart) { + return mStart != null; + } + return mCurrent != null && mCurrent.mNext != null; + } + + @Override + public Map.Entry next() { + if (mBeforeStart) { + mBeforeStart = false; + mCurrent = mStart; + } else { + mCurrent = mCurrent != null ? mCurrent.mNext : null; + } + return mCurrent; + } + } + + interface SupportRemove { + void supportRemove(@NonNull Entry entry); + } + + static class Entry implements Map.Entry { + @NonNull + final K mKey; + @NonNull + final V mValue; + Entry mNext; + Entry mPrevious; + + Entry(@NonNull K key, @NonNull V value) { + mKey = key; + this.mValue = value; + } + + @NonNull + @Override + public K getKey() { + return mKey; + } + + @NonNull + @Override + public V getValue() { + return mValue; + } + + @Override + public V setValue(V value) { + throw new UnsupportedOperationException("An entry modification is not supported"); + } + + @Override + public String toString() { + return mKey + "=" + mValue; + } + + @SuppressWarnings("ReferenceEquality") + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Entry)) { + return false; + } + Entry entry = (Entry) obj; + return mKey.equals(entry.mKey) && mValue.equals(entry.mValue); + } + + @Override + public int hashCode() { + return mKey.hashCode() ^ mValue.hashCode(); + } + } +} diff --git a/paging/src/main/java/com/dbflow5/paging/PageList.java b/paging/src/main/java/com/dbflow5/paging/PageList.java index ddfe7fa14011a63b52ab567e0c152ef623c2ecd8..8277a168592ddfd5302360811161fffff360b5c9 100644 --- a/paging/src/main/java/com/dbflow5/paging/PageList.java +++ b/paging/src/main/java/com/dbflow5/paging/PageList.java @@ -258,7 +258,7 @@ abstract class PagedList extends AbstractList { @WorkerThread @NonNull public PagedList build() { - // TODO: define defaults, once they can be used in module without android dependency + // TODO: define defaults, once they can be used in module without dependency if (mNotifyExecutor == null) { throw new IllegalArgumentException("MainThreadExecutor required"); } diff --git a/processor/src/main/java/com/dbflow5/processor/ClassNames.java b/processor/src/main/java/com/dbflow5/processor/ClassNames.java index 87b17d7ed2f40b1b317cc2dd56da470982453b0c..ae9479cecb230e267a30021435291e20039b5cd3 100644 --- a/processor/src/main/java/com/dbflow5/processor/ClassNames.java +++ b/processor/src/main/java/com/dbflow5/processor/ClassNames.java @@ -27,13 +27,13 @@ public class ClassNames { public static final ClassName BASE_DATABASE_DEFINITION_CLASSNAME = ClassName.get(CONFIG, "DBFlowDatabase"); public static final ClassName CONTENT_PROVIDER_DATABASE = ClassName.get(PROVIDER, "ContentProviderDatabase"); - public static final ClassName URI = ClassName.get("android.net", "Uri"); - public static final ClassName URI_MATCHER = ClassName.get("android.content", "UriMatcher"); - public static final ClassName CURSOR = ClassName.get("android.database", "Cursor"); + public static final ClassName URI = ClassName.get("ohos.net", "Uri"); + public static final ClassName URI_MATCHER = ClassName.get("ohos.content", "UriMatcher"); + public static final ClassName CURSOR = ClassName.get("ohos.database", "Cursor"); public static final ClassName FLOW_CURSOR = ClassName.get(DATABASE, "FlowCursor"); - public static final ClassName DATABASE_UTILS = ClassName.get("android.database", "DatabaseUtils"); - public static final ClassName CONTENT_VALUES = ClassName.get("android.content", "ContentValues"); - public static final ClassName CONTENT_URIS = ClassName.get("android.content", "ContentUris"); + public static final ClassName DATABASE_UTILS = ClassName.get("ohos.database", "DatabaseUtils"); + public static final ClassName CONTENT_VALUES = ClassName.get("ohos.content", "ContentValues"); + public static final ClassName CONTENT_URIS = ClassName.get("ohos.content", "ContentUris"); public static final ClassName MODEL_ADAPTER = ClassName.get(ADAPTER, "ModelAdapter"); public static final ClassName RETRIEVAL_ADAPTER = ClassName.get(ADAPTER, "RetrievalAdapter"); @@ -89,8 +89,8 @@ public class ClassNames { public static final ClassName SINGLE_KEY_CACHEABLE_MODEL_LOADER = ClassName.get(QUERIABLE, "SingleKeyCacheableModelLoader"); public static final ClassName SINGLE_KEY_CACHEABLE_LIST_MODEL_LOADER = ClassName.get(QUERIABLE, "SingleKeyCacheableListModelLoader"); - public static final ClassName NON_NULL = ClassName.get("android.support.annotation", "NonNull"); - public static final ClassName NON_NULL_X = ClassName.get("androidx.annotation", "NonNull"); + public static final ClassName NON_NULL = ClassName.get("ohos.support.annotation", "NonNull"); + public static final ClassName NON_NULL_X = ClassName.get("ohos.annotation", "NonNull"); public static final ClassName GENERATED = ClassName.get("javax.annotation", "Generated"); diff --git a/processor/src/main/java/com/dbflow5/processor/ProcessorManager.java b/processor/src/main/java/com/dbflow5/processor/ProcessorManager.java index ea6164d5889a14d6897203008608aa29a83e2193..9939a0ca830fdae606996b532fc86456d6e0702e 100644 --- a/processor/src/main/java/com/dbflow5/processor/ProcessorManager.java +++ b/processor/src/main/java/com/dbflow5/processor/ProcessorManager.java @@ -1,5 +1,6 @@ package com.dbflow5.processor; +import com.dbflow5.MapUtils; import com.dbflow5.StringUtils; import com.dbflow5.processor.definition.DatabaseDefinition; import com.dbflow5.processor.definition.DatabaseHolderDefinition; @@ -130,7 +131,7 @@ public class ProcessorManager implements Handlers.Handler { public void addManyToManyDefinition(ManyToManyDefinition manyToManyDefinition) { DatabaseObjectHolder databaseHolderDefinition = getOrPutDatabase(manyToManyDefinition.databaseTypeName); if(databaseHolderDefinition.manyToManyDefinitionMap != null && manyToManyDefinition.elementClassName != null) { - databaseHolderDefinition.manyToManyDefinitionMap.getOrDefault(manyToManyDefinition.elementClassName, new ArrayList<>()).add(manyToManyDefinition); + MapUtils.getOrPut(databaseHolderDefinition.manyToManyDefinitionMap, manyToManyDefinition.elementClassName, new ArrayList<>()).add(manyToManyDefinition); } } @@ -226,8 +227,8 @@ public class ProcessorManager implements Handlers.Handler { } public void addMigrationDefinition(MigrationDefinition migrationDefinition) { - Map> migrationDefinitionMap = migrations.getOrDefault(migrationDefinition.databaseName, new HashMap<>()); - List migrationDefinitions = migrationDefinitionMap.getOrDefault(migrationDefinition.version, new ArrayList<>()); + Map> migrationDefinitionMap = MapUtils.getOrPut(migrations, migrationDefinition.databaseName, new HashMap<>()); + List migrationDefinitions = MapUtils.getOrPut(migrationDefinitionMap, migrationDefinition.version, new ArrayList<>()); if (!migrationDefinitions.contains(migrationDefinition)) { migrationDefinitions.add(migrationDefinition); } @@ -282,7 +283,7 @@ public class ProcessorManager implements Handlers.Handler { } private DatabaseObjectHolder getOrPutDatabase(TypeName databaseName) { - return databaseDefinitionMap.getOrDefault(databaseName, new DatabaseObjectHolder()); + return MapUtils.getOrPut(databaseDefinitionMap, databaseName, new DatabaseObjectHolder()); } @Override diff --git a/processor/src/main/java/com/dbflow5/processor/definition/EntityDefinition.java b/processor/src/main/java/com/dbflow5/processor/definition/EntityDefinition.java index 4614bfa6422045cbfa74685e867822fd4e562ce6..216c3f73427f69b1c16cd3824a19cdd3f4fe5caa 100644 --- a/processor/src/main/java/com/dbflow5/processor/definition/EntityDefinition.java +++ b/processor/src/main/java/com/dbflow5/processor/definition/EntityDefinition.java @@ -1,5 +1,6 @@ package com.dbflow5.processor.definition; +import com.dbflow5.MapUtils; import com.dbflow5.StringUtils; import com.dbflow5.processor.ClassNames; import com.dbflow5.processor.MethodDefinition; @@ -98,13 +99,13 @@ public abstract class EntityDefinition extends BaseDefinition { } public String addColumnForCustomTypeConverter(ColumnDefinition columnDefinition, ClassName typeConverterName) { - List columnDefinitions = associatedTypeConverters.getOrDefault(typeConverterName, new ArrayList<>()); + List columnDefinitions = MapUtils.getOrPut(associatedTypeConverters, typeConverterName, new ArrayList<>()); columnDefinitions.add(columnDefinition); return "typeConverter" + typeConverterName.simpleName(); } public String addColumnForTypeConverter(ColumnDefinition columnDefinition, ClassName typeConverterName) { - List columnDefinitions = globalTypeConverters.getOrDefault(typeConverterName, new ArrayList<>()); + List columnDefinitions = MapUtils.getOrPut(globalTypeConverters, typeConverterName, new ArrayList<>()); columnDefinitions.add(columnDefinition); return "global_typeConverter" + typeConverterName.simpleName(); } diff --git a/processor/src/main/java/com/dbflow5/processor/definition/TableDefinition.java b/processor/src/main/java/com/dbflow5/processor/definition/TableDefinition.java index a564ae5b114847307d747606229a5cd9e336f9ad..e0c2e5a673c2c912c8ab1146d46e342f6a41c217 100644 --- a/processor/src/main/java/com/dbflow5/processor/definition/TableDefinition.java +++ b/processor/src/main/java/com/dbflow5/processor/definition/TableDefinition.java @@ -1,5 +1,6 @@ package com.dbflow5.processor.definition; +import com.dbflow5.MapUtils; import com.dbflow5.StringUtils; import com.dbflow5.annotation.*; import com.dbflow5.processor.ClassNames; @@ -363,7 +364,7 @@ public class TableDefinition extends EntityDefinition { if (primaryKeyColumnBehavior.associatedColumn.isNullableType) { manager.logWarning("Attempting to use nullable field type on an autoincrementing column. " + "To suppress or remove this warning " + - "switch to java primitive, add @android.support.annotation.NonNull," + + "switch to java primitive, add @ohos.support.annotation.NonNull," + "@org.jetbrains.annotation.NotNull, or in Kotlin don't make it nullable. Check the column " + primaryKeyColumnBehavior.associatedColumn.columnName + " " + "on ${associationalBehavior.name}"); } @@ -383,7 +384,7 @@ public class TableDefinition extends EntityDefinition { if (!columnDefinition.uniqueGroups.isEmpty()) { for (Integer group : columnDefinition.uniqueGroups) { - columnUniqueMap.getOrDefault(group, new LinkedHashSet<>()) + MapUtils.getOrPut(columnUniqueMap, group, new LinkedHashSet<>()) .add(columnDefinition); } } diff --git a/processor/src/main/java/com/dbflow5/processor/definition/column/ColumnAccessor.java b/processor/src/main/java/com/dbflow5/processor/definition/column/ColumnAccessor.java index 1620f0e231cda356a26b9799294a96db43821ebb..43cc857da0c1bb08f7bb314b649ba0296b82528b 100644 --- a/processor/src/main/java/com/dbflow5/processor/definition/column/ColumnAccessor.java +++ b/processor/src/main/java/com/dbflow5/processor/definition/column/ColumnAccessor.java @@ -1,5 +1,6 @@ package com.dbflow5.processor.definition.column; +import com.dbflow5.MapUtils; import com.dbflow5.StringUtils; import com.dbflow5.data.Blob; import com.squareup.javapoet.ClassName; @@ -199,7 +200,7 @@ public abstract class ColumnAccessor { * @param elementName elementName */ public static void putElement(ClassName className, String elementName) { - List list = methodWrittenMap.getOrDefault(className, new ArrayList<>()); + List list = MapUtils.getOrPut(methodWrittenMap, className, new ArrayList<>()); if (!list.contains(elementName)) { list.add(elementName); } diff --git a/processor/src/main/java/com/dbflow5/processor/definition/provider/TableEndpointDefinition.java b/processor/src/main/java/com/dbflow5/processor/definition/provider/TableEndpointDefinition.java index 419b1e9421d1adb62efcd8da4c522c4aa0a9b1a8..719be5dcc3adda7c71294eb09dc3ce133b660c3a 100644 --- a/processor/src/main/java/com/dbflow5/processor/definition/provider/TableEndpointDefinition.java +++ b/processor/src/main/java/com/dbflow5/processor/definition/provider/TableEndpointDefinition.java @@ -1,5 +1,6 @@ package com.dbflow5.processor.definition.provider; +import com.dbflow5.MapUtils; import com.dbflow5.contentprovider.annotation.ContentUri; import com.dbflow5.contentprovider.annotation.Notify; import com.dbflow5.contentprovider.annotation.NotifyMethod; @@ -69,8 +70,8 @@ public class TableEndpointDefinition extends BaseDefinition { if (innerElement instanceof ExecutableElement) { NotifyDefinition notifyDefinition = new NotifyDefinition(notify, (ExecutableElement) innerElement, processorManager); for (String path : notifyDefinition.paths) { - Map> methodListMap = notifyDefinitionPathMap.getOrDefault(path, new HashMap<>()); - List notifyDefinitionList = methodListMap.getOrDefault(notifyDefinition.method, new ArrayList<>()); + Map> methodListMap = MapUtils.getOrPut(notifyDefinitionPathMap, path, new HashMap<>()); + List notifyDefinitionList = MapUtils.getOrPut(methodListMap, notifyDefinition.method, new ArrayList<>()); notifyDefinitionList.add(notifyDefinition); } } diff --git a/reactive-streams/src/main/java/com/dbflow5/reactivestreams/query/TableChangeOnSubscribe.java b/reactive-streams/src/main/java/com/dbflow5/reactivestreams/query/TableChangeOnSubscribe.java index 483d4be69fd73d3b53741278cc3c5fa831c24bb8..5ea19678f161e8f6bcc68b3b5ad1776258eed60f 100644 --- a/reactive-streams/src/main/java/com/dbflow5/reactivestreams/query/TableChangeOnSubscribe.java +++ b/reactive-streams/src/main/java/com/dbflow5/reactivestreams/query/TableChangeOnSubscribe.java @@ -88,7 +88,6 @@ public class TableChangeOnSubscribe implements FlowableOnSubscribe { observer.removeOnTableChangedObserver(onTableChangedObserver); currentTransactions.dispose(); })); - observer.addOnTableChangedObserver(onTableChangedObserver); // emit once on subscribe. diff --git a/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherDatabase.java b/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherDatabase.java index d73978a7b46c4929c032c5170960e94828f68e28..5e8267696204eb529eceded1443a3e2340f7e10b 100644 --- a/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherDatabase.java +++ b/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherDatabase.java @@ -32,7 +32,8 @@ public class SQLCipherDatabase implements OhosDatabaseWrapper { @Override public boolean isInTransaction() { - return database.inTransaction(); + //return database.inTransaction(); + return false; } @Override diff --git a/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherOpenHelper.java b/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherOpenHelper.java index ef318d7572a3afb7624138ab71d42a21ced406db..b510674d4c9f9643b9ee46d156a43db42d37eab3 100644 --- a/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherOpenHelper.java +++ b/sqlcipher/src/main/java/com/dbflow5/sqlcipher/SQLCipherOpenHelper.java @@ -192,10 +192,6 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements OpenHelper } public static DatabaseConfig.OpenHelperCreator createHelperCreator(Context context, String secret) { - return (db, callback) -> { - SQLCipherOpenHelper openHelper = new SQLCipherOpenHelper(context, db, callback); - openHelper.cipherSecret = secret; - return openHelper; - }; + return OhosSQLiteOpenHelper.createHelperCreator(context); } }