2015-11-29 3 views
0

Я решил использовать Realm для разбора JSONArray, который я получаю из Интернета, и храните его в базе данных. Но кажется, что realm не создает фактический файл базы данных, поскольку я всегда получаю пустой массив, когда я вызываю realm.allObjects, и я искал файл базы данных в своем эмуляторе, и я не нашел папку databases в папке с данными приложения , Самое интересное, что когда я удалить return заявление отReal ORM для Android не создает базу данных

if(pois == null || pois.size() == 0){ loadPoisFromNet(); return; }

он загружает элементы из сети и показывает их в списке, как и ожидалось, но в другой раз, когда я открываю activity он начинает загружать их из web снова и размер предметов всегда 0. Может ли кто-нибудь мне помочь, пожалуйста?

public class PoiListFragment extends Fragment implements PoiListAdapter.OnOpenMapClickListener, 
     AdapterView.OnItemClickListener{ 

    private Realm realm; 
    private PoiListAdapter mAdapter; 
    private ListView mListView; 

    private ProgressDialog progressDialog; 

    public PoiListFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     RealmConfiguration realmConfig = new RealmConfiguration.Builder(getActivity()).build(); 
     Realm.deleteRealm(realmConfig); 
     realm = Realm.getInstance(realmConfig); 
    } 

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

     mListView = (ListView) v.findViewById(R.id.poi_listview); 

     return v; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     initPoisList(); 
    } 

    private void initPoisList(){ 
     RealmResults<Poi> pois = realm.allObjects(Poi.class); 

     if(pois == null || pois.size() == 0){ 
      loadPoisFromNet(); 
      return; 
     } 

     mAdapter = new PoiListAdapter(getActivity(), pois, true, this); 


     mListView.setAdapter(mAdapter); 
     mListView.setOnItemClickListener(this); 

     Log.d("testt", "size " + mListView.getCount()); 
    } 

    private void loadPoisFromNet() { 
     if(!Utils.isNetworkAvailable(getActivity())){ 
      DialogUtils.showOfflineDialogAndFinish(getActivity()); 
      return; 
     } 

     showProgressDialog(); 

     JsonObjectRequest jsObjRequest = new JsonObjectRequest 
       (ApiRequest.getPoiListUrl(), null, new Response.Listener<JSONObject>() { 

        @Override 
        public void onResponse(JSONObject response) { 
         realm.beginTransaction(); 

         try { 
          realm.createAllFromJson(Poi.class, response.getString("list")); 
          realm.commitTransaction(); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
          realm.cancelTransaction(); 
         } 

         cancelProgressDialog(); 
        } 
       }, new Response.ErrorListener() { 

        @Override 
        public void onErrorResponse(VolleyError error) { 
         cancelProgressDialog(); 
        } 
       }); 


     ApiRequest.getInstance(getActivity().getApplicationContext()).addToRequestQueue(jsObjRequest); 
    } 

    @Override 
    public void onOpenMapClick(int position) { 
     Poi poi = mAdapter.getRealmResults().get(position); 
     Utils.openMap(getActivity(), poi); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     realm.close(); // Remember to close Realm when done. 
    } 

    private void showProgressDialog(){ 
     progressDialog = DialogUtils.showTransparentProgress(getActivity()); 
    } 

    private void cancelProgressDialog(){ 
     if (progressDialog != null && progressDialog.isShowing()){ 
      progressDialog.cancel(); 
     } 
    } 
} 

ответ

0

Я нашел ответ на это странное поведение Царства. Проблема была в примерах Кодов Царства. Во всех примерах Realm экземпляр объекта таким образом:

RealmConfiguration realmConfig = new RealmConfiguration.Builder(getActivity()).build(); 
Realm.deleteRealm(realmConfig); 
realm = Realm.getInstance(realmConfig); 

Я не знаю, почему они инстанцируют это так, но это, кажется, удалить все ранее сохраненные данные. Вместо этого я просто создал объект Realm, позвонив по номеру realm = Realm.getInstance(getActivity());, и все прошло отлично!