2016-08-08 4 views
1

Ich habe anfangs einen Fehler gemacht und vergessen, mein Array-Feld (Designs) bei der Benutzerregistrierung zu initialisieren, so dass in meinem Parse-Dashboard die Zeilen als (undefined) angezeigt werden, wo ich sie bevorzugen würde []. Ich muss dies für ungefähr 5000 Benutzer tun. Ich habe versucht, den folgenden Code:Wie kann ich alle Objekte in der Benutzerklasse im Stapel aktualisieren (Parse.com, Android)?

var query = new Parse.Query("User"); 
query.equalTo("designs", "(undefined)"); 
query.each(function(obj) { 
    obj.set("designs", "[]"); 
    return obj.save(); 
}).then(function() { 
    // All objects updated. 
}, function(err) { 
    console.log(err); 
}); 

Ich denke (undefined) etwas anderes sein sollte, aber ich bin mir nicht sicher, was, wie es ist wahrscheinlich kein String. Wie kann ich das lösen?

Update: Ein zweiter Versuch. Nähert sich das?

private void updateAllRows(final int skip) { 

    ParseQuery<ParseUser> query = ParseUser.getQuery(); 
    query.setLimit(500); 
    query.setSkip(skip); 
    query.whereDoesNotExist("designs"); 
    query.findInBackground(new FindCallback<ParseUser>() { 

     @Override 
     public void done(List<ParseUser> results, ParseException e) { 
      if (results.size() > 0) { 

       // The query was successful. 
       for (int i = 0; i < results.size(); i++) { 
        ParseUser user = results.get(i); 
        String[] designs = new String[0]; 
        user.put("designs", Arrays.asList(designs)); 

        try { 
         ParseUser.saveAll(results); 
         if (results.size() >= 500) { 
          updateAllRows(skip + 500); // make a recursion call with different skip value 
         } 
        } catch (ParseException e1) { 
         e1.printStackTrace(); 
        } 
       } 

       Log.d(getClass().toString(), ": The batch job was successfully completed."); 

      } else { 
       // The query was unsuccessful. 
       Log.d(getClass().toString(), ": The batch job was not successful."); 
      } 
     } 
    }); 
} 

Ich nenne teh obige Funktion mit dem folgenden von onCreate Methode meiner Klasse:

int skip = 0; 
updateAllRows(skip); 

Ist dies der beste Weg, um dies zu realisieren, ohne Cloud-Code?

Fehler:

08-08 12:38:43.034 24003-24053/? E/HttpOperation: [luq{checkandengageuser, getmobileexperiments}] Unexpected exception 
                java.io.IOException: 1 of 2 operations in the batch failed 
                 at luj.a(PG:268) 
                 at lth.o(PG:10642) 
                 at ltc.a(PG:1402) 
                 at lth.i(PG:154) 
                 at ly.f(PG:51849) 
                 at dsr.a(PG:1255) 
                 at dsr.a(PG:20077) 
                 at dsr.a(PG:706) 
                 at dss.run(PG:1548) 
                 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
                 at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                 at java.lang.Thread.run(Thread.java:818) 

Antwort

2

JavaScript Version 1. Sie können Parse.Object.saveAll verwenden, um mehrere Objekte in einem Service-Aufruf 2. Sie zu speichern Limit verwenden müssen und überspringen, um es für 500 (oder weniger) Elemente gleichzeitig zu tun. 3. Sie müssen query.doesNotExist ("designs") verwenden;, um alle Einzelteile zu erhalten, die

function updateAllRows(skip) { 
 

 
    var query = new Parse.Query(Parse.User); 
 
    query.limit(500); 
 
    query.skip(skip); 
 
    // get recors where designs is not exist or is undefined  
 
    query.doesNotExist("designs"); 
 

 
    query.find().then(function(results) { 
 

 
    // if we got results then change the designs property 
 
    if (results.length > 0) { 
 

 
     for (var i = 0; i < results.length; i++) { 
 
     var item = results[i]; 
 
     item.set("designs", []); 
 
     } 
 

 
     Parse.Object.saveAll(results).then(function() { 
 
     // if we got 500 or more results then we know 
 
     // that we have more results 
 
     // otherwise we finish 
 
     if (results.length >= 500) { 
 
      updateAllRows(skip + 500); // make a recursion call with different skip value 
 
     } 
 

 
     }, function(err) { 
 
     // error occured 
 
     }); 
 
    } 
 
    }, function(error) { 
 
    // error occured while trying to fetch data 
 
    }); 
 
};

Android Java Version

private void updateAllRows(final int skip){ 

    ParseQuery<ParseUser> query = ParseUser.getQuery(); 
    query.setLimit(500); 
    query.setSkip(skip); 
    query.whereDoesNotExist("designs"); 

    query.findInBackground(new FindCallback<ParseUser>() { 
     @Override 
     public void done(final List<ParseUser> users, ParseException e) { 

      if (e == null){ 
       for (ParseUser user : users){ 
        user.put("designs",new ArrayList<>()); 
       } 

       // save all objects in one server call 
       ParseObject.saveAllInBackground(users, new SaveCallback() { 
        @Override 
        public void done(ParseException e) { 

         if (e == null){ 
          if (users.size() >= 500){ 
           updateAllRows(skip + 500); 
          } 
         } else { 
          // error while saving objects 
         } 


        } 
       }); 
      } 
     } 
    }); 
} 

}

BTW im Design Spalte undefiniert enthalten! Sie können auch eine Cloud-Funktion in Cloud-Code erstellen und diese Funktion vom Client auslösen

+0

Ich bemerkte, dass dies in JavaScript geschrieben wurde. Ich habe meine Frage aktualisiert, um eine Version in Java einzuschließen. Ist das ganze Skipping Bit noch notwendig? Ich habe auch bemerkt, dass du "skip" als Parameter übergeben hast. Wie funktioniert das bei Android? – santafebound

+0

es wurde in JS geschrieben, weil Ihr Beispiel in JavaScript war .. Ich werde die Android-Version –

+0

Oh sorry lol. Meine Zwischenablage war buchstäblich durcheinander. Ich hatte irgendwo in Java eine Alternative geschrieben. – santafebound

Verwandte Themen