Я пытаюсь заполнить 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;