Создать конструктор класса базы данных в Activity

#android #constructor #sqlite #android-sqlite

#Android #constructor #sqlite #android-sqlite

Вопрос:

Пожалуйста, не кидайте в меня камнями, но я действительно не могу получить и найти ответ, почему я не могу вызвать метод из класса DB внутри MainActivity… Похоже, я не сделал ничего плохого, но… Исключение NullPointerException каждый раз, когда я пытаюсь, что я делаю не так? Спасибо за любой ответ!

 public class MainActivity extends ActionBarActivity{

        SQLiteDatabase db;
    DBHelper dbHelper;
    DB mDB;  

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

            dbHelper = new DBHelper(this);
            db = dbHelper.getReadableDatabase();

            mDB = new DB();
            mDB.fillListView();

        }
  

и второй класс с методом

 public class DB {


    final String LOG = "phonebookLogs";
    private static final String TABLE_NAME = "contacts";
    private static final String COL_NAME = "name";
    private static final String COL_SURNAME = "surname";
    private static final String COL_BIRTHDAY = "birthday";
    private static final String COL_SEX = "sex";
    private static final String COL_ADRESS = "adress";
    private static final String COL_LINK = "link";
    private static final String ID = "_id";


    Cursor c;

    public void fillListView(){
        c = db.query(TABLE_NAME, null, null, null, null, null, null);
        if(c != null){
            if(c.moveToFirst()){
                do{
                    String[] names = {c.getString(c.getColumnIndex(COL_SURNAME))   " " 
                              c.getString(c.getColumnIndex(COL_NAME))};
                    int[] links = {c.getInt(c.getColumnIndex(COL_LINK))}; 
                    if(links[0] == 0){
                        links[0] = R.drawable.default_contact;
                    }


                    Log.d(LOG, "n"   links[0]   " "   names[0]);
                }while(c.moveToNext());
            }
        }else{
            Log.d(LOG, "Cursor is null!");
        }

    }
}
  

Войти

 07-06 23:37:09.929: E/AndroidRuntime(10952): FATAL EXCEPTION: main
07-06 23:37:09.929: E/AndroidRuntime(10952): Process: com.nixsolutions.phonebook, PID: 10952
07-06 23:37:09.929: E/AndroidRuntime(10952): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nixsolutions.phonebook/com.nixsolutions.phonebook.MainActivity}: java.lang.NullPointerException
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.ActivityThread.access$800(ActivityThread.java:139)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.os.Handler.dispatchMessage(Handler.java:102)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.os.Looper.loop(Looper.java:136)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.ActivityThread.main(ActivityThread.java:5103)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at java.lang.reflect.Method.invokeNative(Native Method)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at java.lang.reflect.Method.invoke(Method.java:515)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at dalvik.system.NativeStart.main(Native Method)
07-06 23:37:09.929: E/AndroidRuntime(10952): Caused by: java.lang.NullPointerException
07-06 23:37:09.929: E/AndroidRuntime(10952):    at com.nixsolutions.phonebook.DB.fillListView(DB.java:26)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at com.nixsolutions.phonebook.MainActivity.onCreate(MainActivity.java:63)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.Activity.performCreate(Activity.java:5275)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-06 23:37:09.929: E/AndroidRuntime(10952):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166)
07-06 23:37:09.929: E/AndroidRuntime(10952):    ... 11 more
  

Комментарии:

1. И трассировка стека исключений — это …? 🙂

2. Исключение NullPointerException в строке с «mDB.fillListView();»

3. Пожалуйста, опубликуйте точную трассировку стека…

4. теперь добавлено, извините)

5. если я скопирую этот метод из class DB в MainActivity, все будет работать отлично… Я читал, что это может быть ошибка с eclipse, но кажется странным..

Ответ №1:

Сделать DBHelper и db членами класса DB

Изменить fillListView

 public void fillListView(Context context){
    dbHelper = new DBHelper(context);
    db = dbHelper.getReadableDatabase();
    c = db.query(TABLE_NAME, null, null, null, null, null, null);
  

Вызовите его как

 mDB.fillListView(this)