问题描述
在我的应用程序中,我通过蓝牙设备(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 (将#修改为@)