Amplify-android: "createdAt: AWSDateTime" in schema causes Datastore query failure

Created on 24 Jul 2020  路  4Comments  路  Source: aws-amplify/amplify-android

Hello,

I'm using Amplify DataStore to talk to an AppSync API in the cloud. When I include createdAt: AWSDateTime in my schema, all of my queries will fail.

Here's my schema:

type TrackItem @model
@key(name: "byOwnerIdAndPin" fields: ["owner", "pin"] queryField: "itemsByOwnerIdAndPin")
@auth( rules: [ { allow: owner, ownerField: "owner", provider: oidc, identityClaim: "sub" },
                { allow: public, operations: [read, create, delete, update] } ])
{
    id: ID!
    pin: String!
    description: String
    type: String
    owner: String
    createdAt: AWSDateTime
}

This is my query call:

 fun query() {
        Amplify.DataStore.query(TrackItem::class.java,
            {
                val list = mutableListOf<TrackItemModel>()
                while (it.hasNext()) {
                    val item = it.next()
                    Log.i("MyAmplifyApp", "Owner: ${item.owner}")
                    list.add(TrackItemModel(item.id, item.owner, item.pin, item.description))
                }

                _list.postValue(list)
            },
            { Log.e("MyAmplifyApp", "Query failed.", it) }
        )
    }

Here's the exception that I get whenever I do query call:

2020-07-24 09:11:06.689 24938-25040/com.wwm.trackappsyncapp I/MyAmplifyApp: Observing: TrackItem {id=f0da3550-d226-4116-852f-a0f69d6a9470, pin=123231232, description=, type=null, owner=null, createdAt=Temporal.DateTime{offsetDateTime='2020-07-23T16:43:40.464Z'}}
2020-07-24 09:11:06.697 24938-25049/com.wwm.trackappsyncapp I/MyAmplifyApp: Observing: TrackItem {id=68041573-6666-496f-a3db-80a0ba81b651, pin=234343, description=test, type=null, owner=sbstg2napp, createdAt=Temporal.DateTime{offsetDateTime='2020-07-23T19:00:52.406Z'}}
2020-07-24 09:11:06.705 24938-25048/com.wwm.trackappsyncapp E/MyAmplifyApp: Query failed.
    AmplifyException {message=Error in querying the model., cause=java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDateTime.toString()' on a null object reference, recoverySuggestion=See attached exception for details.}
        at com.amplifyframework.datastore.storage.sqlite.SQLiteStorageAdapter.lambda$query$4$SQLiteStorageAdapter(SQLiteStorageAdapter.java:413)
        at com.amplifyframework.datastore.storage.sqlite.-$$Lambda$SQLiteStorageAdapter$rGner20-W7t2tJu4yCrrZwlquWE.run(Unknown Source:10)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDateTime.toString()' on a null object reference
        at java.time.OffsetDateTime.toString(OffsetDateTime.java:1906)
        at java.lang.String.valueOf(String.java:2924)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at com.amplifyframework.core.model.temporal.Temporal$DateTime.toString(Temporal.java:260)
        at java.lang.String.valueOf(String.java:2924)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at com.amplifyframework.datastore.generated.model.TrackItem.hashCode(TrackItem.java:94)

Line 94 is the getCreatedAt() call in this function of TrackItem:

  @Override
   public int hashCode() {
    return new StringBuilder()
      .append(getId())
      .append(getPin())
      .append(getDescription())
      .append(getType())
      .append(getOwner())
      .append(getCreatedAt())
      .toString()
      .hashCode();
  }

Here are my dependencies:

 implementation 'com.amplifyframework:core:1.1.1'
 implementation 'com.amplifyframework:aws-api:1.1.1' // If using cloud sync
 implementation 'com.amplifyframework:aws-datastore:1.1.1'

Thanks

Bug DataStore

Most helpful comment

Hi @jamesonwilliams , @rjuliano, this is the "createdAt: AWSDateTime" issue that we discussed in the Android-help forum. I'm just creating this issue to keep track of it. Please let me know if I'm doing something wrong or if this is a true bug

All 4 comments

Hi @jamesonwilliams , @rjuliano, this is the "createdAt: AWSDateTime" issue that we discussed in the Android-help forum. I'm just creating this issue to keep track of it. Please let me know if I'm doing something wrong or if this is a true bug

Again, thanks so much for doing that. It's easy to lose track of discussions on Discord sometimes. I think this is the correct way to move forward to troubleshoot this issue. Thank you for your patience.

I'm facing the same issue with Amplify API & Datastore version: 1.3.1.

E/MyAmplifyApp: Observation failed.
    AmplifyException {message=Error in saving the model: Actividad[id=93d35142-ab8b-46c1-91ba-a353c908dedb], cause=java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDateTime.toString()' on a null object reference, recoverySuggestion=See attached exception for details.}
        at com.amplifyframework.datastore.storage.sqlite.SQLiteStorageAdapter.lambda$save$3$SQLiteStorageAdapter(SQLiteStorageAdapter.java:333)
        at com.amplifyframework.datastore.storage.sqlite.-$$Lambda$SQLiteStorageAdapter$JhGtXoPGeJ7lbNvRHxROfLs-WmE.run(Unknown Source:12)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDateTime.toString()' on a null object reference
        at java.time.OffsetDateTime.toString(OffsetDateTime.java:1906)
        at java.lang.String.valueOf(String.java:2924)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at com.amplifyframework.core.model.temporal.Temporal$DateTime.toString(Temporal.java:267)
        at java.lang.String.valueOf(String.java:2924)
        at com.amplifyframework.datastore.generated.model.Actividad.toString(Actividad.java:156)
        at com.amplifyframework.datastore.storage.sqlite.SQLiteStorageAdapter.saveModel(SQLiteStorageAdapter.java:693)
        at com.amplifyframework.datastore.storage.sqlite.SQLiteStorageAdapter.lambda$save$3$SQLiteStorageAdapter(SQLiteStorageAdapter.java:315)
        at com.amplifyframework.datastore.storage.sqlite.-$$Lambda$SQLiteStorageAdapter$JhGtXoPGeJ7lbNvRHxROfLs-WmE.run(Unknown Source:12)聽
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)聽
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)聽
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)聽
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)聽
        at java.lang.Thread.run(Thread.java:923)聽
E/ActivityRepository: Update failed.
    AmplifyException {message=Error in saving the model: Actividad[id=93d35142-ab8b-46c1-91ba-a353c908dedb], cause=java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDateTime.toString()' on a null object reference, recoverySuggestion=See attached exception for details.}
        at com.amplifyframework.datastore.storage.sqlite.SQLiteStorageAdapter.lambda$save$3$SQLiteStorageAdapter(SQLiteStorageAdapter.java:333)
        at com.amplifyframework.datastore.storage.sqlite.-$$Lambda$SQLiteStorageAdapter$JhGtXoPGeJ7lbNvRHxROfLs-WmE.run(Unknown Source:12)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDateTime.toString()' on a null object reference
        at java.time.OffsetDateTime.toString(OffsetDateTime.java:1906)
        at java.lang.String.valueOf(String.java:2924)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at com.amplifyframework.core.model.temporal.Temporal$DateTime.toString(Temporal.java:267)
        at java.lang.String.valueOf(String.java:2924)
        at com.amplifyframework.datastore.generated.model.Actividad.toString(Actividad.java:156)
        at com.amplifyframework.datastore.storage.sqlite.SQLiteStorageAdapter.saveModel(SQLiteStorageAdapter.java:693)
        at com.amplifyframework.datastore.storage.sqlite.SQLiteStorageAdapter.lambda$save$3$SQLiteStorageAdapter(SQLiteStorageAdapter.java:315)
        at com.amplifyframework.datastore.storage.sqlite.-$$Lambda$SQLiteStorageAdapter$JhGtXoPGeJ7lbNvRHxROfLs-WmE.run(Unknown Source:12)聽
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)聽
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)聽
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)聽
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)聽
        at java.lang.Thread.run(Thread.java:923)聽

This should be resolved by https://github.com/aws-amplify/amplify-android/pull/825, which has been released in 1.3.2. Please try out that version and let us know if it resolves this bug!

Was this page helpful?
0 / 5 - 0 ratings