0

У меня есть два разных SimpleCursorAdapters и связанные ListViews в MainActivity. Инициализация их:onLoadFinished не называется должным образом из ContentProvider

getLoaderManager().initLoader(0, null, this); 
getLoaderManager().initLoader(2, null, this); 

После инициализации, как погрузчики созданы и побежал запросы на ContentProvider с правильно возвращаемых данных.

реализации LoaderManager:

@Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     CursorLoader loader = null; 

     switch (id) { 
      case 0: 
       loader = new CursorLoader(this, 
         DataProvider.CONTENT_URI_PROFILE_Match, 
         new String[]{DataProvider.COL_ID, DataProvider.COL_MATCH_NAME, DataProvider.COL_COUNT, DataProvider.COL_MATCH_PROFILE_IMAGE, DataProvider.COL_MATCH_BIRTH_DATE}, 
         null, 
         null, 
         DataProvider.COL_ID + " DESC"); 
       break; 
      case 2: 
       loader = new CursorLoader(this, 
         DataProvider.CONTENT_URI_PROFILE_Trash, 
         new String[]{DataProvider.COL_ID, DataProvider.COL_MATCH_NAME, DataProvider.COL_EXPIRATION_STATUS, DataProvider.COL_MATCH_PROFILE_IMAGE, DataProvider.COL_MATCH_BIRTH_DATE}, 
         null, 
         null, 
         DataProvider.COL_ID + " DESC"); 
       break; 
     } 
     return loader; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     switch (loader.getId()) { 
      case 0: 
       adapterMatch.swapCursor(data); 
       break; 
      case 2: 
       adapterTrash.swapCursor(data); 
       break; 
     } 
    } 

Приложение работает следующим образом. при получении сообщения от сервера на BroadcastReceiver, ниже часть кода будет работать на классе приемника и вставить строку в БД с помощью ContentProvider

ContentValues values = new ContentValues(5); 
        values.put(DataProvider.COL_MATCH_ID, matchedUser); 
        values.put(DataProvider.COL_EXPIRATION_STATUS, expirationStatus); 
        values.put(DataProvider.COL_MATCH_NAME, matchName); 
        values.put(DataProvider.COL_MATCH_BIRTH_DATE, matchBirthDate); 
        values.put(DataProvider.COL_MATCH_PROFILE_IMAGE, matchProfileImage); 
        context.getContentResolver().insert(DataProvider.CONTENT_URI_PROFILE_Match, values); 

Моя проблема после того, как вставляя новые значения, полученные от сервера базы данных SQLite, курсор данных не передается в MainActivity, поэтому не обновляйте пользовательский интерфейс до следующего действия.

Ниже Показанные коды от моего ContentProvider:

public static final Uri CONTENT_URI_MESSAGES = Uri.parse("content://com.example.vcc4.mashroom.provider/messages"); 
    public static final Uri CONTENT_URI_PROFILE = Uri.parse("content://com.example.vcc4.mashroom.provider/profile"); 
    public static final Uri CONTENT_URI_PROFILE_Match = Uri.parse("content://com.example.vcc4.mashroom.provider/match"); 
    public static final Uri CONTENT_URI_PROFILE_Trash = Uri.parse("content://com.example.vcc4.mashroom.provider/trash"); 

private static final UriMatcher uriMatcher; 
    static { 
     uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
     uriMatcher.addURI("com.example.vcc4.mashroom.provider", "messages", MESSAGES_ALLROWS); 
     uriMatcher.addURI("com.example.vcc4.mashroom.provider", "messages/#", MESSAGES_SINGLE_ROW); 
     uriMatcher.addURI("com.example.vcc4.mashroom.provider", "profile", PROFILE_ALLROWS); 
     uriMatcher.addURI("com.example.vcc4.mashroom.provider", "profile/#", PROFILE_SINGLE_ROW); 
     uriMatcher.addURI("com.example.vcc4.mashroom.provider", "match", PROFILE_AllROWS_MATCH); 
     uriMatcher.addURI("com.example.vcc4.mashroom.provider", "match/#", PROFILE_SINGLE_ROWS_MATCH); 
     uriMatcher.addURI("com.example.vcc4.mashroom.provider", "trash", PROFILE_ALLROWS_TRASH); 
    } 

@Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     SQLiteDatabase db = dbHelper.getReadableDatabase(); 
     SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 

     switch(uriMatcher.match(uri)) { 
     case MESSAGES_ALLROWS: 
      qb.setTables(TABLE_MESSAGES); 
      break;   

     case MESSAGES_SINGLE_ROW: 
      qb.setTables(TABLE_MESSAGES); 
      qb.appendWhere("_id = " + uri.getLastPathSegment()); 
      break; 

     case PROFILE_ALLROWS: 
      qb.setTables(TABLE_PROFILE); 
      break;   

     case PROFILE_SINGLE_ROW: 
      qb.setTables(TABLE_PROFILE); 
      qb.appendWhere("_id = " + uri.getLastPathSegment()); 
      break; 

     case PROFILE_AllROWS_MATCH: 
      qb.setTables(TABLE_PROFILE); 
      qb.appendWhere(COL_EXPIRATION_STATUS + " = " + "'wait'" + " OR " + COL_EXPIRATION_STATUS + " = " + "'active'"); 
      break; 

     case PROFILE_ALLROWS_TRASH: 
      qb.setTables(TABLE_PROFILE); 
      qb.appendWhere(COL_EXPIRATION_STATUS + " = " + "'expired'"); 
      break; 

     default: 
      throw new IllegalArgumentException("Unsupported URI: " + uri);   
     } 

     Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder); 
     c.setNotificationUri(getContext().getContentResolver(), uri); 
     return c; 
    } 

@Override 
    public Uri insert(Uri uri, ContentValues values) { 
     SQLiteDatabase db = dbHelper.getWritableDatabase(); 

     long id; 
     switch(uriMatcher.match(uri)) { 
     case MESSAGES_ALLROWS: 
      id = db.insertOrThrow(TABLE_MESSAGES, null, values); 
      if (values.get(COL_TO) == null) { 
       db.execSQL("update profile set count = count+1 where email = ?", new Object[]{values.get(COL_FROM)}); 
       getContext().getContentResolver().notifyChange(CONTENT_URI_PROFILE, null); 
      } 
      break; 

     case PROFILE_ALLROWS: 
      id = db.insertOrThrow(TABLE_PROFILE, null, values); 
      break; 

     case PROFILE_AllROWS_MATCH: 
      id = db.insertOrThrow(TABLE_PROFILE, null, values); 
      break; 

     default: 
      throw new IllegalArgumentException("Unsupported URI: " + uri); 
     } 

     Uri insertUri = ContentUris.withAppendedId(uri, id); 
     getContext().getContentResolver().notifyChange(insertUri, null); 

     return insertUri; 
    } 

Я искал много SO вопросов и андроид ресурсов, но не могу найти ключ, чтобы решить эту проблему. Любые решения, пожалуйста?

Edit: ниже добавлены коды для настройки SimpleCursorAdapters:

adapterMatch = new SimpleCursorAdapter(this, 
       R.layout.main_list_item, 
       null, 
       new String[]{DataProvider.COL_MATCH_PROFILE_IMAGE, DataProvider.COL_MATCH_NAME, DataProvider.COL_MATCH_BIRTH_DATE, DataProvider.COL_COUNT, DataProvider.COL_MATCH_ID}, 
       new int[]{R.id.avatar, R.id.text1, R.id.text2, R.id.text3}, 
       0); 
adapterWatch = new SimpleCursorAdapter(this, 
        R.layout.main_list_item, 
        null, 
        new String[]{DataProvider.COL_MATCH_PROFILE_IMAGE, DataProvider.COL_MATCH_NAME, DataProvider.COL_MATCH_BIRTH_DATE, DataProvider.COL_MUTUAL_ACTION, DataProvider.COL_EXPIRATION_STATUS, DataProvider.COL_MATCH_ID}, 
        new int[]{R.id.avatar, R.id.text1, R.id.text2, R.id.text3}, 
        0); 
adapterTrash = new SimpleCursorAdapter(this, 
        R.layout.main_list_item, 
        null, 
        new String[]{DataProvider.COL_MATCH_PROFILE_IMAGE, DataProvider.COL_MATCH_NAME, DataProvider.COL_MATCH_BIRTH_DATE, DataProvider.COL_EXPIRATION_STATUS}, 
        new int[]{R.id.avatar, R.id.text1, R.id.text2, R.id.text3}, 
        0); 

ответ

0

Это не может быть ничего, но не могли бы вы отладки и проверки значения переменной insertUri на 4-й последней строке insert метод в вашем ContentProvider, когда матч вставлен?

+0

Инертная переменная «содержание: //com.example.vcc4.mashroom.provider/match» после вставки соответствия –

+0

Спасибо! Ладно, это не похоже на то, что я думал, что это может быть. – clownba0t

+0

Не могли бы вы опубликовать код, в котором вы создаете 'SimpleCursorAdapter', который вы используете для обработки загруженных данных? – clownba0t