Java - Цель C - для каждой проблемы цикла - PullRequest
1 голос
/ 01 сентября 2011

Я пытаюсь создать приложение в Android, используя некоторые коды из Objective-C (приложение для iPhone). Я пытаюсь понять, что именно делает кусок кода, и перевести его в код Java, но я думаю, что здесь нужна небольшая помощь. Итак, вот код Obj-C:

  (BOOL)processSqlInjectQueries:(NSArray *)injectQueries error:(NSError**)error {
    //some code

    for(NSDictionary * q in injectQueries)
                {
                    if (![q isKindOfClass:[NSDictionary class]]) continue;

                    StPacketInjectQueryPackage qType  = (StPacketInjectQueryPackage)[[q objectForKey:@"type"] intValue];
                    NSString * query = [q objectForKey:@"query"];
                }
    //some code
    }

В Java я пытаюсь сделать что-то вроде этого:

         // in some other method :

        JSONObject jsonData= new JSONObject();
        String authHash = jsonData.getJSONObject("client_auth_hash").toString();
        List<Map<String,String>> injectQueries= new ArrayList<Map<String,String>>();
        injectQueries.add(new HashMap<String, String>());
        //injectQueries.add(authHash);


    public boolean processSqlInjectQueries(List<Map<String,String>> injectQueries, Exception error){

        if(injectQueries==null || injectQueries.size()==0){
            boolean injectsProcessed = this.processSqlInjectQueries(injectQueries,error);
            if(!injectsProcessed){
                return false;
            }
        }

        Log.i("Info","Processing INJECT Queries...");
        boolean res = true;
        /*[_dbAdapter beginTransaction];
        [_user.userDbAdapter beginTransaction];*/

        for(Map<String,String> b : injectQueries){

            if(b.getClass().getName()!=injectQueries.getClass().getName()){
                continue;
            }
            //RPCPacketInjectQueryPackage qType = (RPCPacketInjectQueryPackage) 
        }

        return true;
    }

Но моя проблема в том, что я получаю эту ошибку: Type mismatch: cannot convert from element type Object to ArrayList.

Любое предложение, как исправить эту ошибку?

И второй вопрос: можно ли использовать Exception error при объявлении processSqlInjectQueries вместо NSError *error в Obj-C?

Ответы [ 2 ]

7 голосов
/ 01 сентября 2011

Итерация по списку ArrayList

Ошибка возникает из-за того, что ваш код должен объявить, что b является Object (поскольку injectQueries содержит объекты типа Object, а не объекты типа ArrayList):

for(Object b : injectQueries){
    ...
}

Поскольку класс NSDictionary в Objective-C очень похож на класс Map в Java, вы можете имитировать код Objective C, приведяb как Map или, что еще лучше, вы можете использовать универсальные шаблоны, чтобы указать, что injectQueries содержит Map объектов.Например:

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries, Exception error) {

    // some code

    for(Map<String,String> b : injectQueries) {
        ...
    }

    // some code
    return true;
}

Обработка исключений

Что касается вашего второго вопроса, методы в Java обычно сообщают об ошибках, бросая объекты Exception, поэтому ваша сигнатура методабудет выглядеть следующим образом:

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) throws Exception

Обратите внимание, что всегда лучше быть точным с вашими исключениями (то есть бросать объекты, которые являются подклассами Exception), так что вызывающий ваш метод имеет некоторое представление о том, что пошло не так,Смотрите следующую ссылку для получения дополнительных рекомендаций по обработке исключений в Java:

http://www.javapractices.com/home/HomeAction.do#Exceptions

1 голос
/ 01 сентября 2011

Целевой код C проходит через NSArray, содержащий NSDictionaries, до метода, поэтому следующее, вероятно, ближе к тому, что вы хотите сделать ...

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) {
    for(Map<String,String> q : injectQueries) {
        // do stuff with q
    }
}

Чтобы обработать код ошибки, вы, вероятно, захотите создать исключение, а не пытаться пройти через объект «Ошибка», поэтому что-то вроде следующего:

public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) throws Exception {
    for(Map<String,String> q : injectQueries) {
        // do stuff with q
    }

    if(errorConditionOccurs) {
       throw new Exception();
    }
}

Вы захотите адаптировать выбранное исключение, чтобы оно соответствовало тому, что пытается сделать ваш код.

В ответ на комментарий : возможно, это ближе к тому, что вы пытаетесь сделать?

public boolean processSqlInjectQueries(JSONObject jsonObject) {
    for(String key : jsonObject.keys()) {
        Object value = jsonOnject.get(key);
        // Do stuff with value
    }
    // Do more stuff
}

И вы могли бы назвать это с:

processSqlInjectQueries(jsonData.getJSONObject("client_auth_hash"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...