Giter Club home page Giter Club logo

Comments (6)

sync-by-unito avatar sync-by-unito commented on August 28, 2024

➤ PM Bot commented:

Jira ticket: RJS-2847

from realm-js.

kneth avatar kneth commented on August 28, 2024

@tharwi I am not able to reproduce. How does your code differs from #6774?

from realm-js.

tharwi avatar tharwi commented on August 28, 2024

Hi @kneth, thanks for the reply.

Can you change the below line

      const updatedProfile = { ...currentProfile, lastAccessDate: new Date() };

to this

const profile = realmInstance.objects('Profile')[0];
const updatedProfile = {...profile, lastAccessDate: new Date()};

from realm-js.

elle-j avatar elle-j commented on August 28, 2024

@tharwi, the issue you're seeing is more related to what you're assigning rather than the spread operation itself. When you're using the spread operator it performs a shallow copy, so the trackingDataList on your object will still be the Realm.List from your currentProfile.

This means that when you pass that Realm.List to realm.create(.., .., UpdateMode.Modified), it will basically perform a self-assignment (e.g. object.list = object.list). We do not cache our collections, so even though you're using UpdateMode.Modified, we currently do not know if it's actually the same list being assigned in this case, and we need to clear the underlying collection being assigned to before adding the items of the RHS list (which is why the list becomes empty here).

This is of course something we'd like to fix as soon as possible and the initial work can be tracked here.

As an example, let's say you want to update the valueToUpdate property below:

class ListItem extends Realm.Object {
  value!: number;

  static schema: ObjectSchema = {
    name: "ListItem",
    properties: {
      value: "int",
    },
  };
}

class ObjectWithList extends Realm.Object {
  _id!: BSON.ObjectId;
  list!: Realm.List<ListItem>;
  valueToUpdate!: string;

  static schema: ObjectSchema = {
    name: "ObjectWithList",
    primaryKey: "_id",
    properties: {
      _id: "objectId",
      list: "ListItem[]",
      valueToUpdate: "string",
    },
  };
}

const realm = new Realm({ schema: [ObjectWithList, ListItem] });

const _id = new BSON.ObjectId();
const object = realm.write(() => {
  return realm.create(ObjectWithList, { _id, list: [{ value: 1 }], valueToUpdate: "original" });
});

expect(object.list.length).equals(1);

const objectShallowCopy = { ...object };

// Since it's a shallow copy, the list is still the Realm List.
expect(objectShallowCopy.list).to.be.instanceOf(Realm.List);

realm.write(() => {
  // Unfortunately, passing in the same Realm List again basically
  // performs a self-assignment, clearing the list.
  return realm.create(ObjectWithList, objectShallowCopy, UpdateMode.Modified);
});

// 💥 This will fail.
expect(object.list.length).equals(1);

Workaround:

From the code example you provided, it looks like you only want to update your lastAccessDate field. You can instead pass only the fields to be updated to realm.create() when using UpdateMode.Modified, rather than passing the spread.

realm.write(() => {
-  return realm.create(ObjectWithList, objectShallowCopy, UpdateMode.Modified);
+  return realm.create(ObjectWithList, { _id, valueToUpdate: "updated" }, UpdateMode.Modified);
});

Or skip realm.create() and update the field on the object directly:

 realm.write(() => {
-  return realm.create(ObjectWithList, objectShallowCopy, UpdateMode.Modified);
+  object.valueToUpdate = "updated";
});

from realm-js.

tharwi avatar tharwi commented on August 28, 2024

Hi @elle-j , Thanks for the update. Will use one of the workaround for now.

from realm-js.

nirinchev avatar nirinchev commented on August 28, 2024

Closing since this is tracked in realm/realm-core#7422.

from realm-js.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.