1

При переходе в новую activity приложение вылетает. ниже приведен код того самого activity

package com.example.chernovik;

import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;


import java.io.IOException;



public class ActivityList extends AppCompatActivity {

    TextView txtListView;
    Button b1;
    Button b2;
    Button b3;
    EditText eT;
    ListView listView;
    DataBaseHelper databaseHelper;
    SimpleCursorAdapter userAdapter;
    Cursor userCursor;
    SQLiteDatabase db_sort;
    long userId=0;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        b1 = findViewById(R.id.b1);
        txtListView = findViewById(R.id.txtListView);
        Intent intent = getIntent();
        String outputString = intent.getStringExtra("name");
        txtListView.setText(outputString);
        databaseHelper = new DataBaseHelper(getApplicationContext());


        //создаём БД
        try {
            databaseHelper.createDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
@Override
public void onResume() {
// открываем подключение
    super.onResume();
    db_sort = databaseHelper.openDataBase();
    //получаем данные из бд в виде курсора
    userCursor = db_sort.rawQuery("select * from " + DataBaseHelper.TABLE, null);
    // определяем, какие столбцы из курсора будут выводиться в ListView
    String[] headers = new String[]{DataBaseHelper.COLUMN_NAME};
    // создаем адаптер, передаем в него курсор
    userAdapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item,
            userCursor, headers, new int[]{android.R.id.text1}, 0);
    listView.setAdapter(userAdapter);


    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ContentValues cv = new ContentValues();
            cv.put(DataBaseHelper.DB_NAME, String.valueOf(eT.getText()));
            db_sort.update(DataBaseHelper.TABLE, cv, DataBaseHelper.COLUMN_ID + "=" + String.valueOf(userId + 1), null);
            userId = userId + 1;
            db_sort.insert(DataBaseHelper.TABLE, null, cv);
        }

    });
    b2 = findViewById(R.id.b2);
    b2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            db_sort.delete(DataBaseHelper.TABLE, "_id = ?", new String[]{String.valueOf(userId)});
        }
    });
    b3 = findViewById(R.id.b3);
    b3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            try {

                finish();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    });
}

        }

А также класс базы данных

package com.example.chernovik;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;

import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelper extends SQLiteOpenHelper{

    // путь к базе данных вашего приложения
    private static String DB_PATH="/data/data/com.example.chernovik/DataBase.db/";
    public static String DB_NAME="DataBase.db";
    static final String TABLE = "Data";
    private SQLiteDatabase myDataBase;
    // названия столбцов
    static final String COLUMN_ID = "_id";
    static final String COLUMN_NAME = "data";
    private final Context mContext;


    /**
     * Конструктор
     * Принимает и сохраняет ссылку на переданный контекст для доступа к ресурсам приложения
     */

    public DataBaseHelper(Context context) {

        super(context, DB_NAME, null, 1);
        this.mContext = context;
        DB_PATH=mContext.getFilesDir().getPath() + DB_NAME;
    }

    /**
     * Создает пустую базу данных и перезаписывает ее нашей собственной базой
     * */
    public void createDataBase() throws IOException{
        boolean dbExist = checkDataBase();

        if(dbExist){
            //вызывая этот метод создаем пустую базу, позже она будет перезаписана
            this.getReadableDatabase();


            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }

        }
        else{
            //вызывая этот метод создаем пустую базу, позже она будет перезаписана
            this.getReadableDatabase();


            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }


    public void updateDataBase() throws IOException{

        this.getReadableDatabase();


        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }


    }




    /**
     * Проверяет, существует ли уже эта база, чтобы не копировать каждый раз при запуске приложения
     * @return true если существует, false если не существует
     */
    private boolean checkDataBase(){
        SQLiteDatabase checkDB = null;

        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
        }catch(SQLiteException e){
            //база еще не существует
        }
        if(checkDB != null){
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    /**
     * Копирует базу из папки assets заместо созданной локальной БД
     * Выполняется путем копирования потока байтов.
     * */
    private void copyDataBase() throws IOException{
        //Открываем локальную БД как входящий поток
        InputStream myInput = mContext.getAssets().open(DB_NAME);

        //Путь ко вновь созданной БД
        String outFileName = DB_PATH + DB_NAME;

        //Открываем пустую базу данных как исходящий поток
        OutputStream myOutput = new FileOutputStream(outFileName);

        //перемещаем байты из входящего файла в исходящий
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //закрываем потоки
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public SQLiteDatabase openDataBase() throws SQLException{
        //открываем БД
        String myPath = DB_PATH + DB_NAME;

        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        return null;
    }

    @Override
    public synchronized void close() {
        if(myDataBase != null)
            myDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


    }
 }

Так же ниже приведен полный лог с моей ошибкой

30367-30367/com.example.chernovik E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: com.example.chernovik, PID: 30367
                                                                       java.lang.RuntimeException: Unable to resume activity {com.example.chernovik/com.example.chernovik.ActivityList}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
                                                                           at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3788)
                                                                           at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3828)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2991)
                                                                           at android.app.ActivityThread.-wrap14(ActivityThread.java)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6692)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
                                                                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
                                                                           at com.example.chernovik.ActivityList.onResume(ActivityList.java:61)
                                                                           at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1277)
                                                                           at android.app.Activity.performResume(Activity.java:7058)
                                                                           at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3765)
                                                                           at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3828) 
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2991) 
                                                                           at android.app.ActivityThread.-wrap14(ActivityThread.java) 
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) 
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                           at android.os.Looper.loop(Looper.java:154) 
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6692) 
                                                                           at java.lang.reflect.Method.invoke(Native Method) 
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

С адаптерами и SQLite познакомился совсем недавно, так что буду благодарен за любую помощь

Anton69
  • 61
  • Ошибка говорит о том, что экземпляр класса DataBaseHelper у вас не инициализирован. Код класса DataBaseHelperу вас местами странный. Возьмите код аналогичного класса из этого вопроса (класс DBHelper) – pavlofff Mar 18 '18 at 03:50
  • @pavlofff а как инициализировать экземпляр класса в моём случае? Вроде всё делал по образцу с метанита, то в итоге всё-равно такая ошибка – Anton69 Mar 18 '18 at 07:02
  • ну думаю проблема в том, что этот класс не возвращает объект базы данных для работы, поэтому и null/ Он немного странный, посмотрите по ссылке выше, там точно рабочий класс – pavlofff Mar 18 '18 at 07:07

0 Answers0