Android 如何正确地修改或删除领域中的对象?

Android 如何正确地修改或删除领域中的对象?,android,realm,Android,Realm,我有一个应用程序,当用户单击listview中的某个项目时,有关该项目的信息将显示在另一个页面中,用户可以单击“编辑”或“删除”按钮从列表中删除该项目 问题是删除的代码不起作用。详细信息页面将关闭并返回到列表页面,而不删除或修改任何内容 企图 列表页 list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(Ad

我有一个应用程序,当用户单击listview中的某个项目时,有关该项目的信息将显示在另一个页面中,用户可以单击“编辑”或“删除”按钮从列表中删除该项目

问题是删除的代码不起作用。详细信息页面将关闭并返回到列表页面,而不删除或修改任何内容

企图 列表页

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent in=new Intent(showAll.this,editCar.class);
            in.putExtra("car_id",position);
            startActivity(in);
        }
    });
list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Intent in=新Intent(showAll.this,editCar.class);
in.putExtra(“车号”,位置);
星触觉(in);
}
});
详细信息页

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


    Button btnDelete=(Button) findViewById(R.id.button4);
    Button btnEdit=(Button)findViewById(R.id.edut);

    final EditText comName=(EditText)findViewById(R.id.edit_comp);
    final EditText model=(EditText)findViewById(R.id.edit_model);
    final CheckBox status=(CheckBox)findViewById(R.id.checkbox);

    final int i=getIntent().getIntExtra("car_id",0);

    Realm.init(getApplicationContext());
    final  Realm realm = Realm.getDefaultInstance();

    realm.beginTransaction();

    final RealmResults<Car> cars =realm.where(Car.class).findAll();
    realm.commitTransaction();
    final Car car3=cars.get(i);
    realm.close();


    comName.setText(car3.getName());
    model.setText(car3.getModel());
    status.setChecked(car3.isStatus());
    
    final Context context=this;
    
     btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            new AlertDialog.Builder(editCar.this).setTitle("warning").setMessage("are you sure you want to delete this car ?")
                    .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {


                            Realm.init(getApplicationContext());
                            Realm realm = Realm.getDefaultInstance();
                            realm.beginTransaction();
                            car3.deleteFromRealm();
                            realm.commitTransaction();
                            realm.close();
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() { //if user choose no do nothing
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(context,"no",Toast.LENGTH_SHORT).show();

                        }
                    }).show(); //show dialog
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u edit\u car);
按钮btnDelete=(按钮)findViewById(R.id.button4);
按钮btnEdit=(按钮)findViewById(R.id.edut);
最终EditText comName=(EditText)findViewById(R.id.edit\u comp);
最终EditText模型=(EditText)findViewById(R.id.edit_模型);
最终复选框状态=(复选框)findViewById(R.id.CheckBox);
final int i=getIntent().getIntExtra(“汽车id”,0);
init(getApplicationContext());
final Realm Realm=Realm.getDefaultInstance();
realm.beginTransaction();
final RealmResults cars=realm.where(Car.class.findAll();
realm.commitTransaction();
最终车辆3=车辆。获取(i);
realm.close();
comName.setText(car3.getName());
model.setText(car3.getModel());
status.setChecked(car3.isStatus());
最终上下文=此;
btnDelete.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建AlertDialog.Builder(editCar.this).setTitle(“警告”).setMessage(“确实要删除此车吗?”)
.setPositiveButton(“是”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
init(getApplicationContext());
Realm Realm=Realm.getDefaultInstance();
realm.beginTransaction();
car3.deleteFromRealm();
realm.commitTransaction();
realm.close();
}
})
.setNegativeButton(“否”,新建DialogInterface.OnClickListener(){//如果用户选择“否”,则不执行任何操作
@凌驾
public void onClick(DialogInterface dialog,int which){
Toast.makeText(上下文“否”,Toast.LENGTH_SHORT).show();
}
}).show();//显示对话框

单击“删除”按钮即可添加此功能。这对我有用。:)

这里是我的模型类

Realm realm =  Realm.getDefaultInstance();

final Notifications deletedItem = yourArrayList.get(indexPosition);

realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {

                                    try {
                                        RealmResults<Notifications> **rows** = realm.where(Notifications.class).equalTo("columnKeyName", columnKeyValue).findAll();
                                        **rows**.deleteAllFromRealm();
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            });
                        }
                    });

final int deletedIndex = indexPosition;

// remove the item from recycler view and notify adapter
yourArrayList.remove(deletedIndex);
adapter.notifyDataSetChanged();
Realm-Realm=Realm.getDefaultInstance();
最终通知deletedItem=yourArrayList.get(indexPosition);
realm.executeTransaction(新realm.Transaction(){
@凌驾
公共void执行(领域){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
试一试{
RealmResults**rows**=realm.where(Notifications.class).equalTo(“columnKeyName”,columnKeyValue).findAll();
**行**.deleteAllFromRealm();
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
});
最终int deletedIndex=indexPosition;
//从回收器视图中删除该项目并通知适配器
删除(删除索引);
adapter.notifyDataSetChanged();

希望这也能对您有所帮助。:)

请检查一下,您确定该对象没有被删除-这并不是说您正在返回未刷新的上一个视图(只是检查)?您可以包括汽车类型的定义吗。
Realm.init(getApplicationContext());
覆盖默认配置。您很可能正在写入与预期不同的文件。您应该只调用
Realm.init()
在应用程序类中,然后将您自己的RealmConfiguration设置为默认配置。很高兴这对您有所帮助。:)这不应该起作用。当循环器在该可运行状态下执行写入操作时,事务已关闭。@EpicPandaForce哪里出了问题?这非常适合从列表中删除单个对象。可能
runOnUiThread
检测您是否已经在UI线程上,并且不会发布到处理程序。