Невозможно заполнить ListView данными из базы данных SQLite. - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь заполнить ListView данными из базы данных SQLite.Я проверил бесчисленные учебные пособия, начал изучать переполнение стека, и, хотя у многих людей такая же проблема, как и у меня, чем больше я изучаю, почему код не работает, тем больше я не могу найти проблему.Я, должно быть, упускаю что-то важное в том, как я подошел к этой проблеме, поэтому публикация этого вопроса - действительно мое последнее средство.Буду признателен за любую помощь.

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

Пока что я создал Fragment класс:

public class RecordsListFragment extends Fragment implements OnItemClickListener, OnItemLongClickListener {


    public static final String ARGUMENT_ITEM_ID = "records_list";
    Activity activity;
    ListView recordsListView;
    ArrayList<Records> records;

    RecordsListAdapter recordsListAdapter;
    RecordsDAO recordsDAO;

    private GetRecordsTask task;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activity = getActivity();
    recordsDAO = new RecordsDAO(activity);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_records_list, container, false);
    findViewsById(view);

    task = new GetRecordsTask(activity);
    task.execute((Void) null);

    recordsListView.setOnItemClickListener(this);
    recordsListView.setOnItemLongClickListener(this);

    return view;
    }

    private void findViewsById(View view) {
    recordsListView = (ListView) view.findViewById(R.id.list_records);
    recordsListView.setOnItemClickListener(this);
    recordsListView.setOnItemLongClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Records record = (Records) parent.getItemAtPosition(position);

    if (records != null) {
        Bundle arguments = new Bundle();
        arguments.putParcelable("selectedRecord,", record);

        CustomRecordsDialogFragment customRecordsDialogFragment = new CustomRecordsDialogFragment();
        customRecordsDialogFragment.setArguments(arguments);
        customRecordsDialogFragment.show(getFragmentManager(), CustomRecordsDialogFragment.ARGUMENT_ITEM_ID);
    }
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    Records records = (Records) parent.getItemAtPosition(position);

    recordsDAO.deleteRecord(records);
    recordsListAdapter.remove(records);

    return true;
    }

    public class GetRecordsTask extends AsyncTask<Void, Void, ArrayList<Records>> {

    private final WeakReference<Activity> activityWeakRef;

    ArrayList<Records> recordsArrayList = new ArrayList<>();

    public GetRecordsTask(Activity context) {
        this.activityWeakRef = new WeakReference<Activity>(context);
    }

    @Override
    protected void onPostExecute(ArrayList<Records> empList) {
        if (activityWeakRef.get() != null && !activityWeakRef.get().isFinishing()) {
            records = empList;
            if (empList != null) {
                if (empList.size() != 0) {
                    recordsListAdapter = new RecordsListAdapter(activity, empList);
                    recordsListView.setAdapter(recordsListAdapter);
                } else {
                    Toast.makeText(activity, "No records in the database", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

    @Override
    protected ArrayList<Records> doInBackground(Void... arg0) {
        recordsArrayList = recordsDAO.getRecords();
        return recordsArrayList;
    }
    }

    public void updateView() {
    task = new GetRecordsTask(activity);
    task.execute((Void) null);
    }

    public void onResume() {
    getActivity().setTitle(R.string.app_name);
    getActivity().getActionBar().setTitle(R.string.app_name);
    super.onResume();
    }
}

и Adapter класс

public class RecordsListAdapter extends ArrayAdapter<Records>{

    private Context context;
    List<Records> records;

    private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);

    public RecordsListAdapter(Context context, List<Records> records) {
    super(context, R.layout.list_item, records);
    this.context = context;
    this.records = records;
    }

    private class ViewHolder {
    TextView recordsIdTxt, recordsDescriptionTxt, recordsDateTxt, recordsStartTxt, recordsFinishTxt;
    }

    @Override
    public int getCount() {
    return records.size();
    }

    @Override
    public Records getItem(int position) {
    return records.get(position);
    }

    @Override
    public long getItemId(int position) {
    return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();

        holder.recordsIdTxt = (TextView) convertView.findViewById(R.id.text_record_id);
        holder.recordsDescriptionTxt = (TextView) convertView.findViewById(R.id.text_record_description);
        holder.recordsDateTxt = (TextView) convertView.findViewById(R.id.text_record_date);
        holder.recordsStartTxt = (TextView) convertView.findViewById(R.id.text_record_start);
        holder.recordsFinishTxt = (TextView) convertView.findViewById(R.id.text_record_finish);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    Records records = (Records) getItem(position);
    holder.recordsIdTxt.setText(String.format("%d", records.getId()));
    holder.recordsDescriptionTxt.setText(records.getName());
    holder.recordsDateTxt.setText(formatter.format(records.getDateofRecord()));
    holder.recordsStartTxt.setText(records.getStart());
    holder.recordsFinishTxt.setText(records.getFinish());

    return convertView;
    }

    @Override
    public void add(Records record) {
    records.add(record);
    notifyDataSetChanged();
    super.add(record);
    }

    @Override
    public void remove(Records record) {
    records.remove(record);
    notifyDataSetChanged();
    super.remove(record);
    }
}

, но в ListView ничего не отображается.Теперь я не получаю никаких ошибок, но вижу сообщение о тосте No records in the database, которое появляется даже после заполнения формы и ее сохранения.Фрагмент, в котором происходит сохранение записей, возвращает Record saved + база данных заполнена, я проверил файл базы данных в /data/data, и я использовал DB Browser для SQLite, чтобы проверить это дважды.

Так почемуempList.size() затем =0, если в базе данных есть данные, которые я

Опять же, все, о чем я прошу, - это чтобы кто-нибудь помог мне понять, что происходит и в чем я не прав.

Редактировать 1: Это метод, который я использую для извлечения всех записей из базы данных:

public ArrayList<Records> getRecords() {
    ArrayList<Records> records = new ArrayList<Records>();

    String query = "SELECT " + RECORDS_ID_WITH_PREFIX + ", "
            + RECORDS_NAME_WITH_PREFIX + " ,"
            + DatabaseHelper.KEY_CREATED_AT + ", "
            + DatabaseHelper.STARTINGHOUR + ", "
            + DatabaseHelper.FINISHINGHOUR + ", "
            + DatabaseHelper.COMMENTS + ", "
            + DatabaseHelper.LOCATIONS_ID + ", "
            + DatabaseHelper.TAGS_ID + ", " + LOCATIONS_NAME_WITH_PREFIX + ", " + TAGS_NAME_WITH_PREFIX + " FROM "
            + DatabaseHelper.TABLE_RECORDS + " rec, " + DatabaseHelper.TABLE_LOCATIONS + " loc, " + DatabaseHelper.TABLE_TAGS + " tg "
            + " WHERE rec." + DatabaseHelper.LOCATIONS_ID + " = loc." + DatabaseHelper.ID + " AND "
            + DatabaseHelper.TAGS_ID + " = tg." + DatabaseHelper.ID;

    Cursor cursor = database.rawQuery(query, null);

    while (cursor.moveToNext()) {
        Records records1 = new Records();
        records1.setId(cursor.getInt(0));
        records1.setName(cursor.getString(1));

        try {
            records1.setDateofRecord(formatter.parse(cursor.getString(2)));
        } catch (ParseException e) {
            records1.setDateofRecord(null);
        }

        records1.setStart(cursor.getString(3));
        records1.setFinish(cursor.getString(4));
        records1.setComments(cursor.getString(5));

        Locations locations = new Locations();
        locations.setId(cursor.getInt(6));
        locations.setName(cursor.getString(7));

        Tags tags = new Tags();
        tags.setId(cursor.getInt(8));
        tags.setName(cursor.getString(9));

        records1.setLocations(locations);
        records1.setTags(tags);
        records.add(records1);
    }
    return records;
}

Редактировать 2: решение моегопроблема была тривиальной.Кажется, оператор WHERE отфильтровывает данные из базы данных, поэтому я не смог ничего увидеть в Log.d.Просто замените

    String query = "SELECT " + RECORDS_ID_WITH_PREFIX + ", "
            + RECORDS_NAME_WITH_PREFIX + " ,"
            + DatabaseHelper.KEY_CREATED_AT + ", "
            + DatabaseHelper.STARTINGHOUR + ", "
            + DatabaseHelper.FINISHINGHOUR + ", "
            + DatabaseHelper.COMMENTS + ", "
            + DatabaseHelper.LOCATIONS_ID + ", "
            + DatabaseHelper.TAGS_ID + ", " + LOCATIONS_NAME_WITH_PREFIX + ", " + TAGS_NAME_WITH_PREFIX + " FROM "
            + DatabaseHelper.TABLE_RECORDS + " rec, " + DatabaseHelper.TABLE_LOCATIONS + " loc, " + DatabaseHelper.TABLE_TAGS + " tg "
            + " WHERE rec." + DatabaseHelper.LOCATIONS_ID + " = loc." + DatabaseHelper.ID + " AND "
            + DatabaseHelper.TAGS_ID + " = tg." + DatabaseHelper.ID;

на

String query = "SELECT * FROM " + DatabaseHelper.TABLE_RECORDS;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...