Есть приложение, в нем через DialogFragment
заносятся текстовые данные, база данных подключается так:
public class DatabaseHelper extends SQLiteOpenHelper{
private static String DB_NAME = "Database.sqlite";
private static String DB_PATH = "/data/data/com.example.user.test/databases/";
private SQLiteDatabase myDatabase;
private final Context myContext;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void checkAndCopyDatabase(){
boolean dbExist = checkDatabase();
if (dbExist = true){
Log.d("Log", "database already exist");
}else {
this.getReadableDatabase();
}
copyDatabase(myContext);
}
public boolean checkDatabase(){
SQLiteDatabase checkDB = null;
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
if (checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
public boolean copyDatabase(Context context) {
try {
InputStream inputStream = myContext.getAssets().open(DatabaseHelper.DB_NAME);
String outFileName = DatabaseHelper.DB_PATH + DatabaseHelper.DB_NAME;
OutputStream outputStream = new FileOutputStream(outFileName);
byte[]buff = new byte[1024];
int length = 0;
while ((length = inputStream.read(buff)) > 0) {
outputStream.write(buff, 0, length);
}
outputStream.flush();
outputStream.close();
Log.w("Log","DB copied");
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
public void openDatabase(){
String dbPath = myContext.getDatabasePath(DB_NAME).getPath();
if (myDatabase != null && myDatabase.isOpen()) {
return;
}
myDatabase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public synchronized void close(){
if (myDatabase != null){
myDatabase.close();
}
super.close();
}
public Cursor QueryData(String query){
return myDatabase.rawQuery(query,null);
}
public void addItem(String E, String U) {
ContentValues contentValues = new ContentValues();
contentValues.put("text", E);
contentValues.put("text2", U);;
openDatabase();
myDatabase.insert("tabel", null, contentValues);
close();
}}
Ошибка появляется в классе отвечающем за диалог:
public class AlertDialog extends DialogFragment implements View.OnClickListener{
String E,U;
DatabaseHelper databaseHelper;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.add_dialog, null);
EditText editText = (EditText) v.findViewById(R.id.editText);
EditText editText2 = (EditText) v.findViewById(R.id.editText2);
E = editText.getText().toString();
U = editText2.getText().toString();
v.findViewById(R.id.button).setOnClickListener(this);
v.findViewById(R.id.button2).setOnClickListener(this);
return v;
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
databaseHelper.addItem(E, U);
dismiss();
break;
case R.id.button2:
dismiss();
break;
default:
break;
}
}}
В строке:
databaseHelper.addItem(E, U);
Подскажите пожалуйста в чем проблема.
Проблема заключается в том, что Вы нигде не инициализируете объект databaseHelper
, а по-умолчанию он, как и любой объект, инициализируется значением null
. Далее происходит вызов (не статического!) метода на null
-объекте, отсюда и происходит NullPointerException
(статические же методы могут быть вызваны на null
-объекте, но это так, к слову).
В методе onCreateView(...)
создайте объект, а после этого уже используйте его:
databaseHelper = new DatabaseHelper(getActivity());
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый деньПредстоит новый java maven-проект с использованием Spring Boot, Spring Cloud и т