Android的Real ORM不创建数据库
我决定使用Realm解析我从web获得的Android的Real ORM不创建数据库,android,realm,Android,Realm,我决定使用Realm解析我从web获得的JSONArray,并将其存储在数据库中。但似乎realm并没有创建实际的数据库文件,因为我在调用realm.allObjects时总是得到一个空数组,我在emulator中查找了一个数据库文件,但在应用程序的数据文件夹中没有找到任何databases文件夹。有趣的是,当我从 if(pois==null | | pois.size()==0){ loadpois fromnet(); 返回; } 它从网络加载项目,并按预期在列表中显示它们,但另一次当我打开
JSONArray
,并将其存储在数据库中。但似乎realm并没有创建实际的数据库文件,因为我在调用realm.allObjects
时总是得到一个空数组,我在emulator中查找了一个数据库文件,但在应用程序的数据文件夹中没有找到任何databases
文件夹。有趣的是,当我从
if(pois==null | | pois.size()==0){
loadpois fromnet();
返回;
}
它从网络加载项目,并按预期在列表中显示它们,但另一次当我打开活动时,它再次开始从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();
}
}
}
公共类PoiListFragment扩展片段实现PoiListAdapter.OnOpenMapClickListener,
AdapterView.OnItemClickListener{
私人领域;
私人POILISTAPTER;
私有列表视图;
私有进程对话;
公共PoiListFragment(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
RealmConfiguration realmConfig=newrealmConfiguration.Builder(getActivity()).build();
Realm.deleteRealm(realmConfig);
realm=realm.getInstance(realmConfig);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图v=充气机。充气(R.layout.fragment\u poi\u list,容器,false);
mListView=(ListView)v.findViewById(R.id.poi_ListView);
返回v;
}
@凌驾
恢复时公开作废(){
super.onResume();
initpoissist();
}
私有void initpois列表(){
RealmResults pois=realm.allObjects(Poi.class);
if(pois==null | | pois.size()==0){
loadpois fromnet();
返回;
}
mAdapter=new PoiListAdapter(getActivity(),pois,true,this);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(此);
Log.d(“testt”,“size”+mListView.getCount());
}
私有void loadpois fromNet(){
如果(!Utils.isNetworkAvailable(getActivity())){
showOfflineDialogAndFinish(getActivity());
返回;
}
showProgressDialog();
JsonObjectRequest jsObjRequest=新的JsonObjectRequest
(APIRESQUEST.getPoiListUrl(),null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
realm.beginTransaction();
试一试{
realm.createAllFromJson(Poi.class,response.getString(“list”);
realm.commitTransaction();
}捕获(JSONException e){
e、 printStackTrace();
realm.cancelTransaction();
}
取消进程对话框();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
取消进程对话框();
}
});
ApiRequest.getInstance(getActivity().getApplicationContext()).addToRequestQueue(jsObjRequest);
}
@凌驾
打开映射单击时的公共无效(内部位置){
Poi Poi=mAdapter.getRealmResults().get(位置);
Utils.openMap(getActivity(),poi);
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
}
@凌驾
公共空间{
super.ondestory();
realm.close();//完成后记得关闭realm。
}
私有void showProgressDialog(){
progressDialog=DialogUtils.showTransparentProgress(getActivity());
}
私有void cancelProgressDialog(){
if(progressDialog!=null&&progressDialog.isShowing()){
progressDialog.cancel();
}
}
}
我自己找到了这个奇怪行为的答案。
问题出在领域的示例代码中。在所有示例中,领域
对象的实例化方式如下:
RealmConfiguration realmConfig = new RealmConfiguration.Builder(getActivity()).build();
Realm.deleteRealm(realmConfig);
realm = Realm.getInstance(realmConfig);
我不知道他们为什么这样实例化它,但它似乎删除了所有以前保存的数据。相反,我只是通过调用Realm=Realm.getInstance(getActivity())实例化了Realm
对象代码>一切正常