запрос Android возвращает только последнюю строку

#android #sqlite #android-asynctask

#Android #sqlite #android-asynctask

Вопрос:

Я создаю приложение погоды, которое получает данные из API openweathermap и вставляет их в базу данных в doInBackgroudMethod AsyncTask. В onPostExecute я запрашиваю таблицу базы данных и устанавливаю курсор на SimpleCursorAdapter . Вот проблема: в то время как BulkInsert показывает, что в базу данных вставлено 14 строк, запрос в onPostExecute возвращает только одну строку (которая кажется последней строкой, если я сравниваю полученные значения с JSON, возвращенным с сервера OWM). Эта последняя строка отображается на тестовом устройстве при запуске приложения. Вот код, который я использую для вставки в doInBackground. Я должен добавить, что doInBackground получает данные, анализирует JSON и соответствующим образом форматирует их. На последнем шаге я массово вставляю данные о погоде за 14 дней в базу данных, которая, похоже, работает. Поскольку метод insert() не возвращает -1 или какие-либо странные ошибки. Запрос () не возвращает то, что должен.

    public int bulkInsert(Uri uri, ContentValues[] values) {

        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        final int match = sUriMatcher.match(uri);
        switch (match) {
            case WEATHER:
                db.beginTransaction();
                int returnCount = 0;
                try {
                    for (ContentValues value : values) {
                        normalizeDate(value);
                        long _id = db.insert(WeatherContract.WeatherEntry.TABLE_NAME, null, value);

//this log increases with every insert. The logs are shown below
                        Log.d(MainActivity.TAG, " row id value? "  _id);
                        if (_id != -1) {
                            returnCount  ;
                        }
                    }
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
                }
                getContext().getContentResolver().notifyChange(uri, null);
                db.close();

                mOpenHelper.close();

                return returnCount;
            default:
                return super.bulkInsert(uri, values);
        }


}
  

Я использую следующее для запроса таблицы в onPostExecute

 protected void onPostExecute(String[] strings) {
            super.onPostExecute(strings);
            mForecastAdapter.notifyDataSetChanged();
            Cursor countCursor = getContext().getContentResolver().query(WeatherEntry.CONTENT_URI, null, null, null, null);

            countCursor.moveToFirst();
            int count = countCursor.getCount();

            Log.d(MainActivity.TAG,"row count? " count);

          if(countCursor.moveToFirst()){
              Log.d(MainActivity.TAG, "swapping cursor");

              mForecastAdapter.swapCursor(countCursor);
          }


            Log.d(MainActivity.TAG, "cursor?: " countCursor.moveToFirst());

            String countQuery = "SELECT  * FROM "   WeatherEntry.TABLE_NAME;
            SQLiteDatabase db = new WeatherDbHelper(getContext()).getReadableDatabase();
            Cursor cursor = db.rawQuery(countQuery, null);
            int cnt = cursor.getCount();
            cursor.close();

            Log.d(MainActivity.TAG, " HOW MANY ROWS? " cnt);

        }
  

Вот реализация метода запроса в моем контент-провайдере

   @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
                        String sortOrder) {
        // Here's the switch statement that, given a URI, will determine what kind of request it is,
        // and query the database accordingly.
        Cursor retCursor;
        switch (sUriMatcher.match(uri)) {
            // "weather/*/*"
            case WEATHER_WITH_LOCATION_AND_DATE:
            {
                retCursor = getWeatherByLocationSettingAndDate(uri, projection, sortOrder);
                break;
            }
            // "weather/*"
            case WEATHER_WITH_LOCATION: {
                retCursor = getWeatherByLocationSetting(uri, projection, sortOrder);
                break;
            }
            // "weather"
            case WEATHER: {
                retCursor = mOpenHelper.getReadableDatabase().query(
                        WeatherContract.WeatherEntry.TABLE_NAME,
                        projection,
                        selection,
                        selectionArgs,
                        null,
                        null,
                        sortOrder
                );
                break;
            }
            // "location"
            case LOCATION: {
                retCursor = mOpenHelper.getReadableDatabase().query(
                        WeatherContract.LocationEntry.TABLE_NAME,
                        projection,
                        selection,
                        selectionArgs,
                        null,
                        null,
                        sortOrder
                );
                break;
            }

            default:
                throw new UnsupportedOperationException("Unknown uri: "   uri);
        }
        retCursor.setNotificationUri(getContext().getContentResolver(), uri);

        return retCursor;
    }
  

Вот журналы:

 10-13 09:13:08.416 27330-27330/com.example.android.mysunshine.app D/mainTag: onCreate called: 
10-13 09:13:08.424 27330-27330/com.example.android.mysunshine.app D/mainTag: ON START CALLED
10-13 09:13:08.426 27330-27330/com.example.android.mysunshine.app D/mainTag: 90210
10-13 09:13:10.604 27330-27355/com.example.android.mysunshine.app 
10-13 09:13:10.787 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 1
10-13 09:13:10.788 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 2
10-13 09:13:10.791 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 3
10-13 09:13:10.792 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 4
10-13 09:13:10.794 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 5
10-13 09:13:10.795 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 6
10-13 09:13:10.797 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 7
10-13 09:13:10.799 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 8
10-13 09:13:10.800 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 9
10-13 09:13:10.801 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 10
10-13 09:13:10.803 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 11
10-13 09:13:10.804 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 12
10-13 09:13:10.806 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 13
10-13 09:13:10.807 27330-27355/com.example.android.mysunshine.app D/mainTag:  row id value? 14
10-13 09:13:10.825 27330-27355/com.example.android.mysunshine.app D/mainTag: FetchWeatherTask Complete. 14 rows Inserted
10-13 09:13:10.832 27330-27355/com.example.android.mysunshine.app D/mainTag: immediate count: 1
10-13 09:13:10.834 27330-27330/com.example.android.mysunshine.app D/mainTag: row count? 1
10-13 09:13:10.834 27330-27330/com.example.android.mysunshine.app D/mainTag: swapping cursor
10-13 09:13:10.835 27330-27330/com.example.android.mysunshine.app D/mainTag: cursor?: true
10-13 09:13:10.842 27330-27330/com.example.android.mysunshine.app D/mainTag:  HOW MANY ROWS? 1
  

Вы видите? Код в BulkInsert показывает, что я вставил 14 строк, но запрос возвращает только одну строку.
Кто-нибудь может помочь, пожалуйста?

Комментарии:

1. Показать фактический запрос, который выполняет распознаватель содержимого.

2. Счетчик курсоров = getContext().getContentResolver().query(WeatherEntry. CONTENT_URI, null, null, null, null); Эту строку я использую для запроса таблицы погоды. Это в onPostExecute

3. и что показывает sqlite3 , когда вы хотите получить содержимое вашей таблицы?

4. Я хочу увидеть SQL. Вставьте реализацию средства распознавания содержимого.