2013-03-01 3 views
-5

У меня возникли проблемы с запуском моего приложения для Android. Это простая деятельность, предназначенная для получения данных из удаленной базы данных через HTTP.Ошибка JSON Parsing - строка не может быть преобразована в JSONArray

Я получаю эти две ошибки в лог-кошки:

Ошибка синтаксического анализа в JSON на getJarrayFromString(); org.json.JSONException: База данных значений типа java.lang.String не может быть преобразована в JSONArray .

И:

Ошибка при fillproductlist(): java.lang.NullPointerException

Я не очень хорошо на Java/Android, и это первый раз, когда я задаю этот вопрос Вот. Я не могу понять, на каком слое моего приложения может возникнуть проблема (мой код Java, PHP или код базы данных)?

Код снимок:

private void fillProductList() { 

    if (utils.isInternet() 
      && CustomHttpClient.isAddressOk(Utils.LINK_PRODUCTS)) { 

     final int from = bid.size(); 
     final int nr = 5; 
     long sqliteSize = db.size(mySqlDatabase.TABLE_BOOKS); 
     if (from == 0) { 
      // we add the post variables and values for the request 
      postParameters.add(new BasicNameValuePair("from", String 
        .valueOf(0).toString())); 
      postParameters.add(new BasicNameValuePair("nr", String.valueOf(
        nr).toString())); 
     } else { 
      postParameters.add(new BasicNameValuePair("from", String 
        .valueOf(from).toString())); 
      postParameters.add(new BasicNameValuePair("nr", String.valueOf(
        nr).toString())); 
     } 
     postParameters.add(new BasicNameValuePair("title", titleSearch)); 
     postParameters.add(new BasicNameValuePair("code", codeSearch)); 
     postParameters.add(new BasicNameValuePair("module", moduleSearch)); 
     if (sortOrder != null) 
      postParameters.add(new BasicNameValuePair("order", sortOrder)); 
     if (sortType != null) 
      postParameters.add(new BasicNameValuePair("by", sortType)); 
     task = new RequestTask("books", postParameters); 
     task.setOnTaskCompleted(new OnTaskCompletedListener() { 
      public void onTaskStarted() { 
       if (!rlLoading.isShown()) { 
        rlLoading.startAnimation(fadeIn()); 
        rlLoading.setVisibility(View.VISIBLE); 
       } 
       IS_PRODUCTS_TASK = true; 
      } 

      public void onTaskCompleted(String result) { 
       try { 
        if (result != "") { 
         // Enter the remote php link 
         // we convert the response into json array 
         jarray = utils.getJarrayFromString(result); 
         int mysqlSize = (jarray.getJSONObject(0) 
           .getInt("numRows")); 
         Log.i(DEBUG, "From " + from + " to " + mysqlSize); 
         if (from <= mysqlSize) { 
          int rows; 
          // we check to see if there is 0 
          if (jarray.length() > 0) { 

           Log.i(DEBUG, 
             "From " 
               + from 
               + " to " 
               + Math.floor(mysqlSize/nr) 
               * nr); 
           if (from + 5 <= Math.floor(mysqlSize/nr) 
             * nr) { 
            rows = jarray.length(); 
           } else { 
            rows = mysqlSize % nr + 1; 
            Utils.IS_ENDED_PRODUCT_LIST = true; 
           } 
           ArrayList<String> list = new ArrayList<String>(); 
           for (int i = 1; i < rows; i++) { 
            JSONObject row = jarray 
              .getJSONObject(i); 
            bid.add(row.getInt("bid")); 
            bTitle.add(row.getString("bTitle")); 
            bCode.add(row.getString("bCode")); 
            bPrice.add(row.getString("bPrice") 
              + "£"); 
            bDescription.add(row 
              .getString("bDescription")); 
            bModule.add(row.getString("bModule")); 
            bImage.add(Utils.PATH 
              + row.getString("bImage")); 
            list.add(row.getString("bImage")); 
            // we check if this id already exists in the db, if it doesn't exists w create new one 
            if (!db.hasIDbooks(row.getInt("bid"))) 
             db.createRowOnBooks(
               row.getInt("bid"), 
               row.getString("bTitle"), 
               row.getString("bCode"), 
               row.getString("bPrice"), 
               row.getString("bDescription"), 
               row.getString("bModule"), 
               Utils.PATH 
                 + row.getString("bImage"), 
               row.getString("bSpecialOffer"), 
               row.getInt("bSpecialDiscount"), 
               row.getString("bDateAdded")); 
            Log.i(DEBUG, 
              row.getString("bDescription")); 
           } 
           new DownloadImages(list, bAdapter) 
             .execute(); 
          } 
         } 
         postParameters.removeAll(postParameters); 
        } else { 
         Utils.IS_ENDED_PRODUCT_LIST = true; 
         if (rlLoading.isShown()) { 
          rlLoading.startAnimation(fadeOut()); 
          rlLoading.setVisibility(View.INVISIBLE); 
         } 
        } 
       } catch (Exception e) { 
        Log.e(DEBUG, 
          "Error at fillProductList(): " + e.toString()); 
       } 
      } 
     }); 
     task.execute(); 
    } else { 
     // if we are not connected on internet or somehow the link would not work, then we will take the rows stored in sqlite db 
     if (db.size(mySqlDatabase.TABLE_BOOKS) > 0) { 
      Cursor cursor = db.getBookssRows(mySqlDatabase.TABLE_BOOKS); 
      cursor.moveToFirst(); 
      while (!cursor.isAfterLast()) { 
       bid.add(cursor.getInt(cursor 
         .getColumnIndex(mySqlDatabase.KEY_BID))); 
       bTitle.add(cursor.getString(cursor 
         .getColumnIndex(mySqlDatabase.KEY_BTITLE))); 
       bCode.add(cursor.getString(cursor 
         .getColumnIndex(mySqlDatabase.KEY_BCODE))); 
       bPrice.add(cursor.getString(cursor 
         .getColumnIndex(mySqlDatabase.KEY_BPRICE)) + "£"); 
       bDescription.add(cursor.getString(cursor 
         .getColumnIndex(mySqlDatabase.KEY_BDESCRIPTION))); 
       bModule.add(cursor.getString(cursor 
         .getColumnIndex(mySqlDatabase.KEY_BMODULE))); 
       bImage.add(cursor.getString(cursor 
         .getColumnIndex(mySqlDatabase.KEY_BIMAGE))); 
       cursor.moveToNext(); 
      } 
      bAdapter.notifyDataSetChanged(); 
      Utils.IS_ENDED_PRODUCT_LIST = true; 
     } 
    } 
} 
+1

Ваш код трудно прочитать и может извлечь выгоду из некоторого форматирования. Реальный метод, который нам нужно увидеть, это 'getJarrayFromString (result)'. Добавьте это к своему вопросу. – Perception

+0

Также покажите полученную строку json, которая обрабатывается. – Imperative

+0

Спасибо, ребята, мне очень сложно вставить правильный формат здесь. Есть ли альтернативный способ сделать это? :(Я чувствую себя действительно глупо. – user2123127

ответ

1

В OnTaskCompleted перед тем

jarray = utils.getJarrayFromString(result); 

добавить запись в журнале с

Log.i(DEBUG,result); 

Я подозревающим, что вы получаете нулевое значение, как result

if(result!="") 

не гарантирует действительное значение. Cheers

+0

Спасибо mate :) Я купил этот код у кого-то и, к сожалению, узнал, что после продажи не существует! :( Кроме того, как вы думаете, должно быть имя php-скрипта? Например: if (result! = "Books") или что-то в этом роде Можете ли вы увидеть мой код, если я напишу вам письмо весь код? Пожалуйста, дайте мне знать, если вы можете? Спасибо :) – user2123127

Смежные вопросы