I can save relation BUT can't delete relation ?

hi guys,

in my app a user can join chat group with multiple users … so in my app data there is (Groups) table
and each group have a relation with users table via (Members) schema

the problem is … i can add(save) relations (users) to the group via this code :

Backendless.Persistence.of( Groups.class ).findById( group.objectId,
                                            new AsyncCallback<Groups>() {
                 @Override
                 public void handleResponse(final Groups group ){
                    
                          // Get the user
                          Backendless.UserService.findById(theMember.getUserObjectId(),
                                                    new AsyncCallback<BackendlessUser>() {
                         @Override
                         public void handleResponse( BackendlessUser user ) {

                               group.getMembers().add(user)
                               //Update group
                               Backendless.Persistence.of( Groups.class ).save( group,                                                                new AsyncCallback<Groups>() {                                    @Override
                                    public void handleResponse( Groups response ) {
                                            Adapter.notifyDataSetChanged();
                                    }
                                    @Override
                                    public void handleFault( BackendlessFault fault ) {
                                                                           
                                    }
                                });

                          }
                          @Override
                          public void handleFault( BackendlessFault fault ) {
                                                       
                          }
                          });

                      }
                     @Override
                     public void handleFault( BackendlessFault fault ){
                                                                    }
 });

and its work fine … But when am trying to delete a user from a group (relation) via this code:

Backendless.Persistence.of( Groups.class ).findById( group.objectId,
                                            new AsyncCallback<Groups>() {
                 @Override
                 public void handleResponse(final Groups group ){
                    
                          members = new ArrayList<>(group.getMembers());
                          members.remove(position); // as the row position that user pressed 
                          group.setMembers(members);                               //Update group
                               Backendless.Persistence.of( Groups.class ).save( group,                                                                new AsyncCallback<Groups>() {                                    @Override
                                    public void handleResponse( Groups response ) {
                                            Adapter.notifyDataSetChanged();
                                    }
                                    @Override
                                    public void handleFault( BackendlessFault fault ) {
                                                                           
                                    }
                                });                          }
                          @Override
                          public void handleFault( BackendlessFault fault ) {
                                                       
                          }
                          });

                      }
                     @Override
                     public void handleFault( BackendlessFault fault ){
                                                                    }
 });

It’s not working … So any ideas ?

if because you should NOT copy members

members = new ArrayList<>(group.getMembers());
members.remove(position); // as the row position that user pressed

but delete from collection like this

group.getMembers().remove(position);
 // than save

thanks for responding … but i also tried this

group.getMembers().remove(position); 
// than save


Not working , the relation still there!!!

thanks for responding … but i also tried this

group.getMembers().remove(position); 
// than save

Not working , the relation still there!!!

have you call Backendless.Persistence.of( Groups.class ).save( group, new AsyncCallback<Groups>()…?

Yes… this is my code

Backendless.Persistence.of( Groups.class ).save( group,                                 new AsyncCallback&lt;Groups&gt;() {
    @Override
    public void handleResponse( Groups response )
    {
       
       System.out.println("Success");
       Adapter.notifyDataSetChanged();
    }
    @Override
    public void handleFault( BackendlessFault fault )
    {
       
        System.out.println("Error Message: " + fault.getMessage());
        System.out.println("Error Code: " + fault.getCode());
        System.out.println("Error Detail: " + fault.getDetail());

    }
} );

here it is my example

final IDataStore&lt;Goups&gt; goupsIDataStore = Backendless.Data.of( Goups.class );
System.out.println( "Before remove: " + goupsIDataStore.find().getCurrentPage().get( 0 ).getMembers().size());

goupsIDataStore.findFirst( new AsyncCallback&lt;Goups&gt;()
                                              {
                                                @Override
                                                public void handleResponse( Goups response )
                                                {
                                                  response.getMembers().remove( 0 );
                                                  goupsIDataStore.save( response, new AsyncCallback&lt;Goups&gt;()
                                                  {
                                                    @Override
                                                    public void handleResponse( Goups response )
                                                    {
                                                      System.out.println( "After remove: " + goupsIDataStore.find().getCurrentPage().get( 0 ).getMembers().size());
                                                    }

                                                    @Override
                                                    public void handleFault( BackendlessFault fault )
                                                    {

                                                    }
                                                  } );

                                                }

                                                @Override
                                                public void handleFault( BackendlessFault fault )
                                                {

                                                }
                                              }

);

and result is


/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java -Didea.launcher.port=7533 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA 15.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/ksv/dev/tmp/somereltest/build/classes/main:/Users/ksv/dev/tmp/somereltest/build/resources/main:/Users/ksv/.gradle/caches/modules-2/files-2.1/com.backendless/backendless/3.0.20.1/282a3924b627255f8cde19093702f39e929f9875/backendless-3.0.20.1.jar:/Applications/IntelliJ IDEA 15.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain SomeMain
Before remove: 3
After remove: 2

so it works

I know its working and give me the right response…look i copied your example :

and here my result on the logs :

I/System.out: Before deleting 4
I/System.out: NAME S
I/System.out: NAME K
I/System.out: NAME M
I/System.out: after 3

BUT the problem is nothing changed on the console , the user is still there and when i refresh the activity the results returned to 4 ???

Hey Nasser,

if you copied the code, how come the “System.out.println” is different? That is, Sergey’s code uses the “Before remove” and “After remove” in the println messages…

Mark

hey Mark,

i changed a little things…but the main code is there… her is my code:

final IDataStore&lt;Groups&gt; groupIDataStore = Backendless.Data.of( Groups.class ); 
 
System.out.println("Before deleting " + group.getMembers().size()); qattahIDataStore.findById( group.getObjectId(), 
 new AsyncCallback&lt;Groups&gt;() { 
 @Override 
 public void handleResponse(final Groups group ) { 
 
 group.getMembers().remove(1); 
 
//Update group 
 groupIDataStore.save( group, new AsyncCallback&lt;SubQattahs&gt;() { 
 @Override 
 public void handleResponse( Groups response ) { 
 for (BackendlessUser user: response.getMembers()) { 
 System.out.println("NEW " + user.getProperty("name")); 
 } 
 System.out.println("after "+group.getMembers().size()); 
Adapter.notifyDataSetChanged(); 
 } 
 @Override 
 public void handleFault( BackendlessFault fault ) 
 { 
 System.out.println("Error Message: " + fault.getMessage()); 
 System.out.println("Error Code: " + fault.getCode()); 
 System.out.println("Error Detail: " + fault.getDetail()); 
 
 } 
 } ); 
 
 } 
 @Override 
 public void handleFault( BackendlessFault fault ) 
 { 
 // an error has occurred, the error code can be retrieved with fault.getCode() 
 } 
 }); 



i have 4 users in group.getMembers()
S
N
K
M

so the result

I/System.out: Before deleting 4
I/System.out: NAME S
I/System.out: NAME K
I/System.out: NAME M
I/System.out: after 3

BUT Nothing changed on the console !?

Nasser, we verified that the API works. The free support does not include us debugging your code, which is where I believe the problem is. If you would like us to look into your code and find the problem, please purchase either support plan or “single incident support” from the Marketplace.

Regards,
Mark

if you delete it from collection it does not mean that you delete the member, it mean that you just break relation between Groups and Members. To delete member you should call remove method Backendless.Data.of( Members.class ).remove( )

yes, I just want to break the relation between the group and the user !?
NOT deleting the USER from the data!

OK…I have a question about deleting relations,

Consider the following (Backendless) example :
http://support.backendless.com/public/temp/2a4b61f9c07a28c6d381bb0d270dbbac.png</img>
let say , in my case, my app data have multiple phonebooks !?

and each phonebook have multiple contacts!

and each contact have multiple addresses!

So, if i want to delete a relation between a contact AND one if it’s addresses!

  • Is it enough to retrieve the exact contact by it’s objectId and then remove the address from contact.getAddresses() list ?

OR

*Do I have to retrieve the phonebook and then find the contact from phonebook.getContacts() list and then get the address from contact.getAddresses() list , AND last, remove it?

it is enough to retrieve the exact contact by it’s objectId and then remove the address from contact.getAddresses() list and then save contact

Thank you very much Sergey
Any suggestions about my case up there !?

thanks Mark,

I have produced example of my code, is this the same case as yours?