Комната - SELECT не возвращает никаких данных - PullRequest
0 голосов
/ 20 февраля 2020

Не могу понять, где моя ошибка - кажется, что данные вставлены (я проверил файл базы данных через Device File Explorer), но он не возвращается. Интересно, находится ли он в адаптере или ViewHolder или где-либо еще. Любая помощь предоставляется!

Это действие, в котором я выполняю свои запросы

public class ShowDatabaseActivity extends AppCompatActivity {
    private List <Contact> contactsList = new ArrayList<>()

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_database);
        setupToolbar();
        initRecyclerView();
        Intent intent = getIntent();
        unpack(intent);
    }

    private void setupToolbar() {
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
            toolbar.setNavigationOnClickListener(v -> onBackPressed());
        }
    }

    private void initRecyclerView() {
        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        final ContactsListAdapter adapter = new ContactsListAdapter(contactsList);
        adapter.notifyDataSetChanged();
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(adapter);
    }

    private void unpack(Intent intent) {
        final Handler handler = new Handler();
        Thread backgroundThread = new Thread(() -> {
            Bundle extras = intent.getExtras();
            String lastName = extras.getString(Constants.LAST_NAME_KEY);
            String firstName = extras.getString(Constants.FIRST_NAME_KEY);
            String middleName = extras.getString(Constants.MIDDLE_NAME_KEY);
            int age = extras.getInt(Constants.AGE_KEY);
            Contact contact = new Contact(lastName, firstName, middleName, age);
            AppDatabase.getINSTANCE(ShowDatabaseActivity.this).contactDao().insert(contact);
            AppDatabase.getINSTANCE(ShowDatabaseActivity.this).contactDao().getAll();
            handler.post(() -> {

            });
        });
        backgroundThread.start();
    }
}

Если я отлаживаю эту строку, данные успешно отображаются -

(ShowDatabaseActivity.this).contactDao().insert(contact);

Мой адаптер

public class ContactsListAdapter extends RecyclerView.Adapter<ContactsListAdapter.ContactViewHolder> {
    private Context context;
    private List<Contact> contacts;

    public ContactsListAdapter(@NonNull List<Contact> contacts) {
        this.contacts = contacts;
    }

    @Override
    public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final LayoutInflater inflater = LayoutInflater.from(context);
        View itemView = inflater.inflate(R.layout.recycler_view, parent, false);
        return new ContactViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) {
            Contact currentContact = contacts.get(position);
            if (currentContact!=null) {
                holder.contactLastNameView.setText(currentContact.getLastName());
                holder.contactFirstNameView.setText(currentContact.getFirstName());
                holder.contactMiddleNameView.setText(currentContact.getMiddleName());
                holder.contactAgeView.setText(Integer.toString(currentContact.getAge()));
            }
            else {
                holder.contactLastNameView.setText("No information");
                holder.contactFirstNameView.setText("No information");
                holder.contactMiddleNameView.setText("No information");
                holder.contactAgeView.setText("No information");
            }
    }

    @Override
    public int getItemCount() {
        return contacts.size();
    }

    class ContactViewHolder extends RecyclerView.ViewHolder {
        private final TextView contactLastNameView;
        private final TextView contactFirstNameView;
        private final TextView contactMiddleNameView;
        private final TextView contactAgeView;

        private ContactViewHolder(View itemView) {
            super(itemView);
            contactLastNameView = itemView.findViewById(R.id.last_name_text_view);
            contactFirstNameView = itemView.findViewById(R.id.first_name_text_view);
            contactMiddleNameView = itemView.findViewById(R.id.middle_name_text_view);
            contactAgeView = itemView.findViewById(R.id.age_text_view);
        }
    }

    @Override
    public int getItemViewType(final int position) {
        return R.layout.recycler_view;
    }
}

Моя база данных

@Database(entities = {Contact.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
    public abstract ContactDao contactDao();

    private List<Contact> allContacts;

    List<Contact> getAllContacts() {
        return allContacts;
    }

    private static AppDatabase INSTANCE;

    public synchronized static AppDatabase getINSTANCE(Context context) {
            INSTANCE = getDatabase(context);
        return INSTANCE;
    }

    private static AppDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (AppDatabase.class) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            AppDatabase.class, "table_contacts")
                            .build();
                Log.d("LOG", "Getting the database instance");
            }
        }
        return INSTANCE;
    }
}

Нет сомнений в моих классах Entity и Dao, так как они отлично работали с другими вариантами базы данных, поэтому я не присоединяю их. Буду очень признателен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Ваш код неполон

Вы устанавливаете только пустой массив внутри вашего адаптера, чтобы исправить это, чтобы сделать объект вашего адаптера глобальным

Ваш handler.post не имеет ничего внутри него

вам нужно создать функцию внутри вашего адаптера, как показано ниже

      public void addItem(List<Contacts> list) {

        mList.add(list) 

 notifyItemInserted(mList.size - 1)

    }

Теперь вам нужно вызвать addItem внутри вашего handler.post , используя

adapter.addItem(contact)

Это добавит содержимое в список вашего адаптера и также уведомит chnages

0 голосов
/ 20 февраля 2020
 AppDatabase.getINSTANCE(ShowDatabaseActivity.this).contactDao().getAll();

Этот код не назначает данные чему-либо / переменной для хранения ваших данных. Присвойте данные ссылочной переменной и передайте эту переменную адаптеру, чтобы он мог отображать данные из нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...