簡體   English   中英

領域未在Android上持久化交易

[英]Realm not persisting transaction on Android

我目前有一個帶有listView的片段,我想用Realm的記錄來填充它。 在我的應用程序的第一次運行中,沒有任何記錄,因此我創建了一個asynctask來從JSON文件填充數據庫。

問題是,如果對asynctask進行注釋,則調用new MuscleTask().execute(); ,找不到任何記錄,例如是否未持久化事務。 因此,每次更新代碼時,每次在手機上運行應用程序時,數據庫都會被清空,或者我在這里做錯了什么?

我是否還應該在asynctask中執行此操作,還是只需要創建一個RealmAsyncTransaction ,然后使用RealmChangeListener執行某些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;
    }
}

編輯:這是我的基本適配器。

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;
    }
}

編輯2:添加了我的應用程序應用程序類

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
    }
}

正如@AdamS所指出的,我的FititApplication類上的這一行Realm.deleteRealm()Application擴展到了我的問題。 注釋那行代碼是解決我的問題所需要的。 該行代碼每次都會刪除我的數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM