#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. Вставьте реализацию средства распознавания содержимого.