来自 AlertDialog 类的 sql lite 数据库的更改不起作用

问题描述

在我的应用程序中,我通过蓝牙设备(Arduino/机器人)配对使用,我需要为这些设备保存一些设置。我使用简单的 sql lite 数据库添加更改这些设置的能力很重要,为此我使用警报对话框,它有自己的类。所以我尝试从这个类更新数据库。但我有奇怪的空对象引用错误。怎么了?数据基类:

public class DeviceDBHelper extends sqliteOpenHelper { 

    public static DeviceDBHelper instance;

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "addedDevices";
    public static final String TABLE_DEVICES = "device";

    public static final String KEY_ID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_MAC = "address";
    public static final String KEY_URL_PH = "photo";
    public static final String KEY_CLASS = "class";
    public static final String KEY_PROTO = "id_protocol";
    public static final String KEY_PANEL = "id_panel";

    public DeviceDBHelper(Context context) {super(context,DATABASE_NAME,null,DATABASE_VERSION);}

    @Override
    public void onCreate(sqliteDatabase db) {
        db.execsql("create table " + TABLE_DEVICES + "(" + KEY_ID + " integer primary key AUTOINCREMENT,"
                + KEY_NAME + " text," + KEY_MAC + " text," + KEY_CLASS + " text,"
                + KEY_URL_PH + " text," + KEY_PROTO + " text,"
                + KEY_PANEL + " text" + ")");
    }

    @Override
    public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
        db.execsql("drop table if exists " + TABLE_DEVICES);

        onCreate(db);
    }

    public int count() {
        sqliteDatabase db = this.getReadableDatabase();
        String query = "Select * from " + TABLE_DEVICES;
        Cursor cursor = db.rawQuery(query,null);
        return cursor.getCount();
    }

    public void viewData() {
        sqliteDatabase db = this.getReadableDatabase();
        String query = "Select * from " + TABLE_DEVICES;
        Cursor cursor = db.rawQuery(query,null);
        cursor.movetoFirst();
        for (int i = 0; i < cursor.getCount(); i++) {
            Log.d("sql",cursor.getInt(0) + " " + cursor.getString(1));
            cursor.movetoNext();
        }
    }

    public int insert(ContentValues contentValues) {
        int result = 0;
        sqliteDatabase db = this.getWritableDatabase();
        String query ="select * from " + TABLE_DEVICES + " where " + KEY_MAC + " = '" + contentValues.get(KEY_MAC) + "';";
        Cursor cursor = db.rawQuery(query,null);
        if (cursor.getCount() == 0) {
            db.insert(TABLE_DEVICES,contentValues);
            result = 1;
        }
        return result;
    }

    public void update(ContentValues contentValues,int id) {
        sqliteDatabase db = this.getWritableDatabase();
        db.update(TABLE_DEVICES,contentValues,"_id=?",new String[]{String.valueOf(id)});
    }

    public void deleteDevice(int id) {
        sqliteDatabase db = this.getReadableDatabase();
        String query = "DELETE FROM " + TABLE_DEVICES + " WHERE _id = " + id + ";";
        Log.d("sql",query);
        db.execsql(query);
    }

    public static synchronized DeviceDBHelper getInstance(Context context) {
        if (instance == null) {
            instance = new DeviceDBHelper(context);
        }
        return instance;
    }
}

警报对话框代码

    DeviceDBHelper dbHelper;
    Spinner spinnerProtocol;
    String newName;
    String name;
    int id;
    String protocol;
    AlertDialog.Builder builder;
    ArrayList<String> data = new ArrayList<String>() {{
        add("main_protocol");
        add("wheel_platform");
    }};

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        id = getArguments().getInt("id");
        name = getArguments().getString("name");
        String MAC = getArguments().getString("MAC");
        String classDevice = getArguments().getString("protocol");
        builder=new AlertDialog.Builder(getActivity());
        
        return builder.setTitle("Информация")
                .setMessage("Name: " + name + "\nMAC address: " + MAC)
                .setPositiveButton("Подключиться",(dialog,whichButton) -> {
                    Bundle b = new Bundle();
                    b.putString("protocol",classDevice);
                    b.putString("MAC",MAC);
                    b.putString("name",name);
                    Intent intent = new Intent().setClass(getActivity(),Manual_mode.class);
                    intent.putExtras(b);
                    NewDevice arduino = new NewDevice(requireActivity(),MAC,classDevice);
                    arduino.startBluetoothConnectionService();
                })
                .setNegativeButton("Удалить",whichButton) -> MainActivity.activity.setBdUpdated(id))
                .setNeutralButton("Редактировать",which) -> {
                    changeDeviceAlert();
                })
                .create();
    }

    @Override
    public void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
        if (data == null) {return;}
        String message = data.getStringExtra("message");
        Bundle args = new Bundle();
        args.putString("message",message);
        setArguments(args);
    }

    void changeDeviceAlert(){
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(requireActivity(),android.R.layout.simple_spinner_item,data);
        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerProtocol = new Spinner(requireActivity());
        EditText editTextNameAlert = new EditText(requireActivity());
        spinnerProtocol.setAdapter(spinnerAdapter);
        id = getArguments().getInt("id");
        String name = getArguments().getString("name");
        editTextNameAlert.setText(name);
        editTextNameAlert.setInputType(InputType.TYPE_CLASS_TEXT);
        editTextNameAlert.setHint("Device Name");
        String MAC = getArguments().getString("MAC");
        String classDevice = getArguments().getString("protocol");
        for(int i = 0; i<data.size(); i++){
            if (data.get(i).equals(classDevice)){
                spinnerProtocol.setSelection(i);
                break;
            }
        }
        AlertDialog.Builder setSettingsToDeviceAlertDialog = new AlertDialog.Builder(requireActivity());
        setSettingsToDeviceAlertDialog.setTitle("Change Device settings");
        
        LinearLayout layout = new LinearLayout(requireActivity());
        layout.setorientation(LinearLayout.VERTICAL);
        if(spinnerProtocol.getParent() != null) {
            ((ViewGroup)spinnerProtocol.getParent()).removeView(spinnerProtocol); // <- fix crash
        }
        layout.addView(editTextNameAlert);
        layout.addView(spinnerProtocol);
        setSettingsToDeviceAlertDialog.setView(layout);
        setSettingsToDeviceAlertDialog.setPositiveButton("OK",(dialogInterface,i) -> {
            newName = editTextNameAlert.getText().toString();
            protocol = data.get((int) spinnerProtocol.getSelectedItemId());
            ContentValues contentValues = new ContentValues();
            contentValues.put(DeviceDBHelper.KEY_MAC,MAC);
            contentValues.put(DeviceDBHelper.KEY_NAME,newName);
            contentValues.put(DeviceDBHelper.KEY_PROTO,protocol);
            dbHelper.update(contentValues,id);
            Toast.makeText(requireActivity(),"Device has been edited",Toast.LENGTH_LONG).show();
            MainActivity.activity.setBdUpdated(-1);
            dbHelper.viewData();
        });
        setSettingsToDeviceAlertDialog.setNegativeButton("Cancel",i) -> {
            dialogInterface.cancel();
        });
        setSettingsToDeviceAlertDialog.create();
        setSettingsToDeviceAlertDialog.show();
    }
} 

日志:

java.lang.NullPointerException: Attempt to invoke virtual method 'void ru.hse.control_system_v2.dbdevices.DeviceDBHelper.update(android.content.ContentValues,int)' on a null object reference
        at ru.hse.control_system_v2.DialogDevice.lambda$changeDeviceAlert$3$DialogDevice(DialogDevice.java:155) 

155 行是 dbHelper.update(contentValues,id);

请帮忙...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)