У меня есть фрагмент с listView, который я хочу заполнить записями из Realm. В первом запуске моего приложения нет записей, поэтому я создал асинтез для заполнения базы данных из файла JSON.Realm не продолжает транзакции на Android
Дело в том, что если комментарий для асинхронного вызова new MuscleTask().execute();
, записей не найдено, например, если транзакция не сохраняется. Итак, каждый раз, когда я запускаю приложение на своем телефоне, когда я обновляю код, база данных сбрасывается, или я делаю что-то неправильно здесь?
Должен ли я делать это в asynctask, или мне просто нужно создать RealmAsyncTransaction
, а затем сделать что-то с RealmChangeListener
?
Мой код не делает исключение.
public static class LandingWorkoutDirectoryFragment extends BaseFragment {
private RealmResults<Muscle> muscles;
private MuscleAdapter muscleAdapter;
private ListView listView;
public LandingWorkoutDirectoryFragment() {
}
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static LandingWorkoutDirectoryFragment newInstance() {
LandingWorkoutDirectoryFragment fragment = new LandingWorkoutDirectoryFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
muscles = getRealm().allObjects(Muscle.class);
new MuscleTask().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_landing_workout_directory, container, false);
listView = (ListView) rootView.findViewById(R.id.listview_display_exercises);
muscleAdapter = new MuscleAdapter(getActivity(), muscles, true);
listView.setAdapter(muscleAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("Di click", String.valueOf(position));
Intent intent = new Intent(getActivity(), DisplayExerciseActivity.class);
intent.putExtra("muscleId", muscles.get(position).getId());
intent.putExtra("muscleName", muscles.get(position).getName());
startActivity(intent);
}
});
return rootView;
}
private class MuscleTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Realm realm = Realm.getDefaultInstance();
InputStream is = null;
try {
is = getActivity().getAssets().open("muscles.json");
realm.beginTransaction();
realm.createOrUpdateAllFromJson(Muscle.class, is);
realm.commitTransaction();
} catch (IOException e) {
realm.cancelTransaction();
}
return null;
}
}
}
Вот мой мускул адаптер
public class MuscleAdapter extends RealmBaseAdapter<Muscle> implements ListAdapter {
static class ViewHolder {
@Bind(R.id.firstLine) TextView name;
@Bind(R.id.secondLine) TextView description;
@Bind(R.id.icon) ImageView image;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
public MuscleAdapter(Context context, RealmResults<Muscle> realmResults, boolean automaticUpdate) {
super(context, realmResults, automaticUpdate);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.listview_item_exercise, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Muscle item = realmResults.get(position);
viewHolder.name.setText(item.getName());
viewHolder.description.setText(item.getDescription());
Glide.with(parent.getContext()).load(item.getImage()).into(viewHolder.image);
return convertView;
}
}
Edit: Это мой базовый адаптер.
public class BaseFragment extends Fragment {
public final String log = this.getClass().getSimpleName();
public Realm realm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
realm = Realm.getDefaultInstance();
}
@Override
public void onDestroy() {
super.onDestroy();
realm.close();
}
public Realm getRealm() {
return realm;
}
}
Edit 2: Добавлено мое приложение Application Класс
public class FititApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Configure Realm for the application
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
Realm.deleteRealm(realmConfiguration); // Clean slate
Realm.setDefaultConfiguration(realmConfiguration); // Make this Realm the default
}
}
Как выглядит ваша реализация 'getRealm()'? Вы не заметили «RealmChangeListener» или вызов в onPostExecute (реализация либо просто вызовет «notifiyDataSetChanged()» на вашем адаптере), но это не ваша проблема здесь - если данные сохраняются, вы должны это увидеть. –
@AdamS, я отправил код моего BaseAdapter, который содержит декларацию '' getRealm() ''. –
Это выглядит хорошо. Вы предоставляете конфигурацию Realm в любом месте? Или у вас есть опция «удалить при развертывании» в вашей конфигурации развертывания? (Исходя из памяти) –