Php 关于列顺序的表到JSON对象的FMDB结果。
编辑:底部有一个新问题,它得到了所有的行,我错了 我正在尝试获取SQL查询的结果,并将其放入json对象中,以发送到我的服务器,以便对数据进行更多的处理。现在我的代码只返回1行数据。有人能看到任何明显的错误吗? IOS端Php 关于列顺序的表到JSON对象的FMDB结果。,php,ios,objective-c,json,fmdb,Php,Ios,Objective C,Json,Fmdb,编辑:底部有一个新问题,它得到了所有的行,我错了 我正在尝试获取SQL查询的结果,并将其放入json对象中,以发送到我的服务器,以便对数据进行更多的处理。现在我的代码只返回1行数据。有人能看到任何明显的错误吗? IOS端 - (void)sendLogin { NSError *jsonError; NSData *requestdata; //get login NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocument
- (void)sendLogin
{
NSError *jsonError;
NSData *requestdata;
//get login
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [docPaths objectAtIndex:0];
NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"tar.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
FMResultSet *Loginresults = [database executeQuery:@"SELECT * FROM surveys"];
NSMutableArray *results = [NSMutableArray array];
while ([Loginresults next]) {
[results addObject:[Loginresults resultDictionary]];
requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];
}
[database close];
NSURL *url = [NSURL URLWithString:@"http://server/insert.php"];
NSMutableURLRequest *request;
request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", [requestdata length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:requestdata];
//this kicks off the request asynchronously
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
PHP端
<?php
$foo = file_get_contents("php://input");
var_dump(json_decode($foo, true));
?>
我还注意到我对该表的结果顺序不正确。这是否符合预期?有没有办法将其排序以便与列的顺序匹配?我不熟悉FMDatabase。但我认为你的问题在于while的陈述:
FMResultSet *Loginresults = [database executeQuery:@"SELECT * FROM surveys"];
NSMutableArray *results = [NSMutableArray array];
while ([Loginresults next]) {
[results addObject:[Loginresults resultDictionary]];
requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];
}
您正在用每个结果覆盖变量:requestdata
如果您必须为此更改代码,可能会:
FMResultSet *Loginresults = [database executeQuery:@"SELECT * FROM surveys"];
NSMutableArray *results = [NSMutableArray array];
while ([Loginresults next])
{
[results addObject:[Loginresults resultDictionary]];
}
requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];
嗯。让我解释一下解决办法。正如您在评论中所说,您在整个应用程序中都在使用库 所以,我认为解决你问题的最好办法就是创造一个。OrderedDictionary包含一个NSMutableDictionary和一个NSMutableArray,用于跟踪密钥的顺序 您可以创建FMResultSet的类别: FMResultSet+OrderedDict.h
#import <Foundation/Foundation.h>
#import "FMResultSet.h"
#import "OrderedDictionary.h"
@interface FMResultSet(OrderedDict)
- (OrderedDictionary*)resultOrderDictionary;
@end
如果需要,我可以将我的项目测试上传到github
编辑:现在已上载。您是否有FMResultSet的扩展名?我看到了,但没有看到方法resultDictionary。嘿,我遵循这个指南,也参考了这个问题。你能给我发一个示例项目吗?我测试了你的代码,创建了一个包含两行的表,php显示了这两行。你们有几排?可能是结果大小的问题。对不起,我编辑了我的问题。它显示了正确的行数,我正在与订单进行斗争。太好了!!谢谢我会尝试这个和其他解决方案,然后发回,让你知道我做了什么。不客气。如果您愿意,您可以更改问题的标题,以便具有相同问题的其他人可以找到答案。
#import <Foundation/Foundation.h>
#import "FMResultSet.h"
#import "OrderedDictionary.h"
@interface FMResultSet(OrderedDict)
- (OrderedDictionary*)resultOrderDictionary;
@end
#import "FMResultSet+OrderedDict.h"
#import "OrderedDictionary.h"
#import "FMDatabase.h"
@implementation FMResultSet(OrderedDict)
- (OrderedDictionary*)resultOrderDictionary {
NSUInteger num_cols = (NSUInteger)sqlite3_data_count([_statement statement]);
if (num_cols > 0) {
OrderedDictionary *dict = [OrderedDictionary dictionaryWithCapacity:num_cols];
int columnCount = sqlite3_column_count([_statement statement]);
int columnIdx = 0;
for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {
NSString *columnName = [NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)];
id objectValue = [self objectForColumnIndex:columnIdx];
[dict setObject:objectValue forKey:columnName];
}
return dict;
}
else {
NSLog(@"Warning: There seem to be no columns in this set.");
}
return nil;
}
@end
NSMutableArray *results = [NSMutableArray array];
while ([Loginresults next]) {
[results addObject:[Loginresults resultOrderDictionary]];
}
requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];