2016-02-15 4 views
1

У меня есть фрагмент с 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 
    } 
} 
+1

Как выглядит ваша реализация 'getRealm()'? Вы не заметили «RealmChangeListener» или вызов в onPostExecute (реализация либо просто вызовет «notifiyDataSetChanged()» на вашем адаптере), но это не ваша проблема здесь - если данные сохраняются, вы должны это увидеть. –

+0

@AdamS, я отправил код моего BaseAdapter, который содержит декларацию '' getRealm() ''. –

+0

Это выглядит хорошо. Вы предоставляете конфигурацию Realm в любом месте? Или у вас есть опция «удалить при развертывании» в вашей конфигурации развертывания? (Исходя из памяти) –

ответ

0

Как отметил @AdamS, эта линия Realm.deleteRealm() на моем FititApplication класса Wich простирается от Application была моя проблема. Комментируя, что строка кода была решена, чтобы исправить мою проблему. Эта строка кода каждый раз удаляла мою базу данных.

Смежные вопросы