21

Parse を使用して、リスト ビューのデータを取得しています。残念ながら、デフォルトでリクエストを 100 に制限し、最大 1000 に制限しています。私のクラスの最大数は1000をはるかに超えています。iOSでそれを行う方法を示すリンクをWebで見つけましたが、Androidでどのように行いますか? ウェブリンク

私は現在、すべてのアイテムが完了するまで(100)ループ内のarraylistにすべてのデータを追加してから、それらをリストに追加しています

4

11 に答える 11

45

私は自分の目標を達成する方法を見つけました:

グローバル変数の宣言

private static List<ParseObject>allObjects = new ArrayList<ParseObject>();

クエリを作成

final ParseQuery parseQuery = new ParseQuery("Objects");
parseQuery.setLimit(1000);
parseQuery.findInBackground(getAllObjects());

クエリのコールバック

int skip=0;
FindCallback getAllObjects(){
    return new FindCallback(){
        public void done(List<ParseObject> objects, ParseException e) {
            if (e == null) {

                allObjects.addAll(objects);
                 int limit =1000;
                if (objects.size() == limit){
                    skip = skip + limit;
                    ParseQuery query = new ParseQuery("Objects");
                    query.setSkip(skip);
                    query.setLimit(limit);
                    query.findInBackground(getAllObjects());
                }
                //We have a full PokeDex
                else {
                    //USE FULL DATA AS INTENDED
                }
        }
    };
}
于 2013-09-09T10:39:18.037 に答える
14

これは約束のないJavaScriptバージョンです..

これらはグローバル変数です (コレクションは必要ありません。私の悪い癖です)。

   ///create a collection of cool things and instantiate it (globally)
    var CoolCollection = Parse.Collection.extend({
       model: CoolThing
    }), coolCollection = new CoolCollection();

これは、結果を取得する「ループ」機能です。

//recursive call, initial loopCount is 0 (we haven't looped yet)
function getAllRecords(loopCount){

    ///set your record limit
    var limit = 1000;

    ///create your eggstra-special query
     new Parse.Query(CoolThings)
            .limit(limit)
            .skip(limit * loopCount) //<-important
            .find({
             success: function (results) {
                 if(results.length > 0){

                     //we do stuff in here like "add items to a collection of cool things"
                     for(var j=0; j < results.length; j++){
                         coolCollection.add(results[j]);
                     }

                     loopCount++; //<--increment our loop because we are not done

                     getAllRecords(loopCount); //<--recurse
                 }
                 else
                 {
                     //our query has run out of steam, this else{} will be called one time only
                     coolCollection.each(function(coolThing){
                        //do something awesome with each of your cool things
                     });
                 }
            },
             error: function (error) {
                //badness with the find
             }
         });
}

これはあなたがそれを呼び出す方法です(または他の方法で行うこともできます):

getAllRecords(0);
于 2014-09-11T00:46:41.377 に答える
3

C#では、次の再帰を使用します。

private static async Task GetAll(int count = 0, int limit = 1000)
{
    if (count * limit != list.Count) return;
    var res = await ParseObject.GetQuery("Row").Limit(limit).Skip(list.Count).FindAsync();
    res.ToList().ForEach(x => list.Add(x));
    await GetAll(++count);
}

JSバージョン:

function getAll(list) {
    new Parse.Query(Row).limit(1000).skip(list.length).find().then(function (result) {
        list = list.concat(result);
        if (result.length != 1000) {
            //do here something with the list...
            return;
        }

        getAll(list);
    });
}

使用法: GetAll()C# およびgetAll([])JS で。

Rowクラスのすべての行を に保存しますlist。各リクエストで 1000 行を取得し、現在のサイズのlist. エクスポートされた行の現在の数が予想と異なる場合、再帰は停止します。

于 2016-01-28T11:59:59.090 に答える
0

CloudCode を使用してこれを実現できます...コレクション全体を列挙し、そこから応答を構築する呼び出し可能なカスタム関数を作成しますが、より賢明な選択は、要求をページ分割し、1000 (またはそれ以下) のレコードをフェッチすることです必要に応じてリストに動的に追加します。

于 2013-06-24T07:06:58.447 に答える