Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不保存java的领域数据_Java_Android_Android Studio_Realm - Fatal编程技术网

不保存java的领域数据

不保存java的领域数据,java,android,android-studio,realm,Java,Android,Android Studio,Realm,调用对话框后,我试图将数据保存到RealmList。对话框应该采用新对象的名称,即FixtureInfo,将其添加到RealmList,然后移动到下一个活动。但是,在移动到下一个活动并按下后退按钮后,用该RealmList填充的ListView不会显示刚刚创建的对象。没有错误,只是没有显示出来。有什么想法吗 编辑添加到RealmBaseAdapter中,正如Beeender建议的那样,问题依然存在 第一项活动 public class RoomDescription extends Action

调用对话框后,我试图将数据保存到
RealmList
。对话框应该采用新对象的名称,即
FixtureInfo
,将其添加到
RealmList
,然后移动到下一个活动。但是,在移动到下一个活动并按下后退按钮后,用该
RealmList
填充的
ListView
不会显示刚刚创建的对象。没有错误,只是没有显示出来。有什么想法吗

编辑添加到
RealmBaseAdapter
中,正如Beeender建议的那样,问题依然存在

第一项活动

public class RoomDescription extends ActionBarActivity {

    public AlertDialog.Builder dialogBuilder;
    public RealmList<FixtureInfo> myFixtures = new RealmList<>();
    public String RoomName;
    public String FixtureName;
    public RealmList<Rooms> myRooms = new RealmList<>();
    private Realm realm;
    public Rooms rooms;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_room_description);

        //get room name
        TextView textFixture = (TextView) findViewById(R.id.RoomName);
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            RoomName = extras.getString("txtString");
            textFixture.setText(RoomName);
        }


        //initiate realm instant to get CompanyInfo object, Room object, and populate myRoom and myFixtures
        realm = Realm.getInstance(this);
        rooms = realm.where(Rooms.class).equalTo("Name", RoomName).findFirst();
        realm.beginTransaction();
        CompanyInfo companyinfo = realm.where(CompanyInfo.class).findFirst();
        myRooms = companyinfo.getRooms();
        myFixtures = rooms.getFixtureInfos();
        realm.commitTransaction();
        populateListView();
    }

    @Override
    protected void onResume() {
        super.onResume();
        LoadInfo();
    }

    @Override
    protected void onPause() {
        super.onPause();
        SaveInfo();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        realm.close();
    }

    private void setFixtureName()
    {
        //dialog to add fixture to room and set its name
        dialogBuilder = new AlertDialog.Builder(this);
        final EditText txtInput = new EditText(this);


        dialogBuilder.setTitle("New Fixture");
        dialogBuilder.setMessage("What is the fixture name?");
        dialogBuilder.setView(txtInput);
        dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //initiate realm instant
                Realm realm = Realm.getInstance(getApplicationContext());
                realm.beginTransaction();
                //get fixture name and create FixtureInfo object
                FixtureName = txtInput.getText().toString();
                FixtureInfo fixtureInfo = realm.createObject(FixtureInfo.class);
                fixtureInfo.setName(FixtureName);
                fixtureInfo.setRoomName(RoomName);
                myFixtures.add(fixtureInfo);
                realm.commitTransaction();
                //save changes
                SaveInfo();
                //start new activity
                Intent i = new Intent(RoomDescription.this, FixtureDescription.class);
                i.putExtra("textString", FixtureName);
                i.putExtra("txtString", RoomName);
                populateListView();
                Toast.makeText(getApplicationContext(), "Fixture has been added.", Toast.LENGTH_SHORT).show();
                startActivity(i);

            }
        });
        dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                SaveInfo();
            }
        });

        AlertDialog dialogFixtureName = dialogBuilder.create();
        dialogFixtureName.show();
    }

    private void setRoomName()
    {
        //same as setRoomName in RoomList.java
        dialogBuilder = new AlertDialog.Builder(this);
        final EditText txtInput = new EditText(this);


        dialogBuilder.setTitle("New Room");
        dialogBuilder.setMessage("What is the room name?");
        dialogBuilder.setView(txtInput);
        dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Realm realm = Realm.getInstance(getApplicationContext());
                realm.beginTransaction();
                String txtString = txtInput.getText().toString();
                Rooms rooms = realm.createObject(Rooms.class);
                rooms.setName(txtString);
                myRooms.add(rooms);
                realm.commitTransaction();
                SaveInfo();
                realm.close();
                Intent i = new Intent(RoomDescription.this, RoomDescription.class);
                i.putExtra("txtString", txtString);
                Toast.makeText(getApplicationContext(), "Room has been added.", Toast.LENGTH_SHORT).show();
                populateListView();
                startActivity(i);
            }
        });
        dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                SaveInfo();
            }
        });

        AlertDialog dialogFixtureName = dialogBuilder.create();
        dialogFixtureName.show();
    }

    private void removeFixture()
    {
        //remove fixture from room
        dialogBuilder = new AlertDialog.Builder(this);

        dialogBuilder.setTitle("Select Fixture to Remove");
        dialogBuilder.setSingleChoiceItems(myFixtures.toArray(new String[myFixtures.size()]), -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //initiate realm instant
                Realm realm = Realm.getInstance(getApplicationContext());
                //remove fixture info from room
                realm.beginTransaction();
                myFixtures = rooms.getFixtureInfos();
                myFixtures.remove(which);
                //save change
                SaveInfo();
                populateListView();
                Toast.makeText(getApplicationContext(), "Fixture has been removed.", Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        });

        AlertDialog dialogFixtureName = dialogBuilder.create();
        dialogFixtureName.show();
    }
    private void populateListView()
    {
        //on click for the list of FixtureInfo connected to the room
        ListView list = (ListView) findViewById(R.id.FixtureList);
        RealmResults<FixtureInfo> results = realm.where(FixtureInfo.class).equalTo("RoomName", RoomName).findAll();
        FixtureListAdapter adapter = new FixtureListAdapter(this, results, true);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                switch (position) {
                    default:
                        Intent i = new Intent(RoomDescription.this, FixtureDescription.class);
                        TextView textItem = (TextView) view;
                        String FixtureName = textItem.getText().toString();
                        i.putExtra("textString", FixtureName);
                        i.putExtra("txtString", RoomName);
                        startActivity(i);
                        break;
                }

            }

        });

    }

    public void SaveInfo()
    {
        //save info or update info
        realm.beginTransaction();
        rooms.setName(RoomName);
        rooms.setFixtureInfos(myFixtures);
        realm.copyToRealmOrUpdate(rooms);
        realm.commitTransaction();
    }

    public void LoadInfo()
    {
        //load info from specific room
        realm.beginTransaction();
        myFixtures = rooms.getFixtureInfos();
        realm.commitTransaction();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_room_description, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        switch (item.getItemId())
        {
            case R.id.newFixture:
                setFixtureName();
                break;
            case R.id.removeFixture:
                removeFixture();
                break;
            case R.id.add:
                setRoomName();
                break;
            case R.id.home:
                startActivity(new Intent(getApplicationContext(), MainPage.class));
                break;
            case R.id.summary:
                startActivity(new Intent(getApplicationContext(), Summary.class));
                break;
        }


        return super.onOptionsItemSelected(item);
    }
}

我建议您在
onClick
中设置一个中断指针,以检查您试图添加到那里的fixtureInfo。由于
RoomName
是主键,因此如果您试图使用不同的
RoomName
更改
FixtrueInfo
,我不希望您在
列表视图中看到任何更改,因为
RealmResults
基于原始名称

还有其他几个问题:

  • 事务只需要写,不需要读
  • 如果对象是由
    Realm.createObject
    创建的,则无需再调用
    copyToRealmOrUpdate

  • 我建议您在我们的示例上多花几分钟。而且,java领域背后的机制是我们使用代理对象重载getter/setter。这并不难。您可以在构建目录中找到
    fixtureinforeamproxy.java
    。理解整件事会很有趣也很有帮助,也许你也可以快速看一下:)

    你没有在域事务中的
    populateListView
    中保存任何内容到域,我不太明白
    populateListView
    的意思。要将Realm与ListView结合使用,
    RealmBaseAdapter
    将是一个非常方便的选择。见医生。例如:我正在使用realm事务添加到
    RealmList
    ,在使用
    SaveInfo()
    保存事务后,如果您没有在
    FixtureList
    上调用
    notifyDataSetChanged()
    ,列表视图永远不会知道您想要更新它。对于当前代码,我认为即使您调用了它,listview也不会更新,因为您没有向适配器提供新数据。如果您想使用Realm的自动更新功能,请尝试阅读我在上一条评论中添加的两个链接。创建了一个
    RealmBaseAdapter
    ,但问题仍然存在。我在适配器和实现的java文件中进行了编辑。我的实现不正确吗?嗨,在这种情况下阅读代码不是很容易。我建议您在
    onClick
    中设置一个中断指针,以检查您试图添加的
    fixtureInfo
    。由于
    RoomName
    是主键,因此如果您试图使用不同的
    RoomName
    更改
    FixtrueInfo
    ,我不希望您在列表视图中看到任何更改,因为
    RealmResults
    基于原始名称。还有另外两个问题:1。事务只需要写,不需要读。2.如果对象是由
    Realm.createObject
    创建的,则无需再调用
    copyToRealmOrUpdate
    public class FixtureListAdapter extends RealmBaseAdapter<FixtureInfo> implements ListAdapter {
        private static class ViewHolder{
            TextView FixtureName;
        }
        public FixtureListAdapter(Context context, RealmResults<FixtureInfo> 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(android.R.layout.simple_list_item_1,
                        parent, false);
                viewHolder = new ViewHolder();
                viewHolder.FixtureName = (TextView) convertView.findViewById(android.R.id.text1);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
            FixtureInfo fixtureInfo = realmResults.get(position);
            viewHolder.FixtureName.setText(fixtureInfo.getName());
            return convertView;
        }
    }
    
    public class FixtureInfo extends RealmObject{
        @PrimaryKey
        private String RoomName;
        @Ignore
        private String Name;
        private String Description;
        private String Wattage;
        private String Run_Time;
        private String Bulbs_Out;
        private String Notes;
        private int Count;
    
        public String getRoomName() {
            return RoomName;
        }
    
        public void setRoomName(String roomName) {
            RoomName = roomName;
        }
        public void setCount(int count) {
            Count = count;
        }
    
        public int getCount() {
            return Count;
        }
    
        public void setName(String name) {
            Name = name;
        }
    
        public void setDescription(String description) {
            Description = description;
        }
    
        public void setWattage(String wattage) {
            Wattage = wattage;
        }
    
        public void setRun_Time(String run_Time) {
            Run_Time = run_Time;
        }
    
        public void setBulbs_Out(String bulbs_Out) {
            Bulbs_Out = bulbs_Out;
        }
    
        public void setNotes(String notes) {
            Notes = notes;
        }
    
        public String getName() {
            return Name;
        }
    
        public String getDescription() {
            return Description;
        }
    
        public String getWattage() {
            return Wattage;
        }
    
        public String getRun_Time() {
            return Run_Time;
        }
    
        public String getBulbs_Out() {
            return Bulbs_Out;
        }
    
        public String getNotes() {
            return Notes;
        }
    
    }