1

データベースにクエリを実行するIOSアプリを作成しています。私は結果を順不同で取得し続けています。コメントなどのアプリの一部の機能では、結果を順番に取得することが重要です。JSONがdictを返していることは明らかですが、結果を順序付けする必要があります。サーバー側のコードは次のとおりです。

function sendResponse($status = 200, $body = '', $content_type = 'text/html') {
  $status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status);
  header($status_header);
  header('Content-type: ' . $content_type);
  echo $body;
}

$result = array();
$i = 0;
$sqlGetComments = mysqli_query($link, "SELECT * FROM photo_comments WHERE photo_id='$photoID' ORDER BY post_date DESC");
while ($row = mysqli_fetch_array($sqlGetComments)) {
  $result[$i] = array(
      'photoID' => $row['photo_id'],
      'userID' => $row['userID'],
      'username' => $row['username'],
      'comment' => $row['comment'],
      'postedDate' => $row['post_date'],
    );
    $i++;
} // end while

sendResponse(200, json_encode($result));

それを解析するIOSコードがありますが、必要な方法から外れています。ですから、サーバー側でできることがあるはずです。

更新、クライアント側のコードは次のとおりです。

[request setCompletionBlock:^{
    NSString *responseString = [request responseString];
   [self updateComments:responseString];
}];


- (void)updateComments:(NSString *)update {
     NSDictionary *root = [update JSONValue];
     NSEnumerator *enumerator = [root keyEnumerator];
     id key;
     while (key = [enumerator nextObject]) {
        NSDictionary *value = [root objectForKey:key];
       _photoID = [value objectForKey:@"photoID"];
       NSString *photoID = [value objectForKey:@"photoID"];
       NSString *userID = [value objectForKey:@"userID"];
       NSString *username = [value objectForKey:@"username"];
       NSString *comment = [value objectForKey:@"comment"];
       NSString *postedDate = [value objectForKey:@"postedDate"];

       NSString *cellString = [NSString stringWithFormat:@"%@ \n %@ \n %@", username, comment, postedDate];

       [_queryResultsMessage addObject:cellString];
     }
     [_tableView reloadData];
}

コメントフィールドの「Test」文字列がJSON文字列の出力方法であることに注意して、出力を次に示します。

{"1":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 6","postedDate":"7 hrs ago"},"2":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 5","postedDate":"8 hrs ago"},"3":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 4","postedDate":"8 hrs ago"},"4":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 3","postedDate":"8 hrs ago"},"5":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 2","postedDate":"8 hrs ago"},"6":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 1","postedDate":"8 hrs ago"}}

印刷はOKですが、NSDictionaryに割り当てられたときに混乱していると思います。誰も答えがない場合は、NSArrayに割り当てて、それをいじってみて、なんとかして解析できるかどうかを確認します。

4

3 に答える 3

1

少しクライアント側のIOSハッカリーが必要でした

まだ解決策に興味がある人のために:

NSDictionary *userData = [update JSONValue];
NSArray *keys = [[userData allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *array = [NSMutableArray arrayWithCapacity: [keys count]];

int i = 0;
for (NSString *key in keys) {
    [array addObject: [userData objectForKey: key]];
    i++;
}

for (NSDictionary *myDict in array) {
    NSString *comment = [myDict objectForKey:@"comment"];
    NSLog(@"USERCOMMENT %@", comment);
}

JSONをすべて順番に返します。

USERCOMMENT Test 6
USERCOMMENT Test 5
USERCOMMENT Test 4
USERCOMMENT Test 3
USERCOMMENT Test 2
USERCOMMENT Test 1
于 2012-07-07T21:36:11.317 に答える
0

MySqlクエリでは、で並べ替えていますが、結果配列に追加するときにpost_date参照します。postedDate両方が存在しますか?

post_date実際に存在しない場合、データベースクエリは期待どおりに並べ替えられていません...

于 2012-07-06T03:07:46.427 に答える
0

注目に値するのは、-MySQLから注文されたアイテムをリクエストしている-Ergo、PHPがJSONを順番に生成していることです。

このため、PHPでループを編集することをお勧めします...

while ($row = mysqli_fetch_array($sqlGetComments)) {
  $result[$i] = array(
      'photoID' => $row['photo_id'],
      'userID' => $row['userID'],
      'username' => $row['username'],
      'comment' => $row['comment'],
      'postedDate' => $row['postedDate'],
      'orderBy' => $i
    );
    $i++;
} // end while

...そしてObj-Cの「orderBy」でそれらを整理します。

私が行ったのは、JSONアイテムに変数を追加することだけです-"orderBy"; MySQLの結果は正しい順序になり、正しい順序で解析されるため、この「orderBy」変数はキーのように機能する可能性があります。

iOS SDKを使用してからしばらく経ちますが、NSMutableArrayを並べ替える方法になると確信しています。そうでない場合-単純なループが機能する可能性があります。x <NSMutableArrayの長さで、xのキーを使用して各オブジェクトを要求します。しかし、それは私を悩ませるので、私はそれを行う「正しい」方法を調べます!

しかし、結果が順不同になる背後にある本当の理由を調査することをお勧めします!それは起こってはいけません!私はiOSで同様のことをしていませんが、JSONを要求するときのこれは正しい動作ではないと思います。

トラブルシューティングの手順は、返されたJSONをブラウザー内またはデスクトップ環境でチェックし、PHPが正しく返すことを確認してから、アプリにどのように返されるかを確認することです。すべてのデータが存在することと、順序の歪みにパターンがあるかどうかを確認します。 。

編集:あなたがそれが辞書の配列を返していると言っていることに気づきました。私の悪い。一連の辞書の並べ替えに関する別の質問を 見つけました。

于 2012-07-06T02:06:37.750 に答える