Нужна помощь в чтении из базы данных SQLite для Android - PullRequest
4 голосов
/ 13 марта 2012

Я прочитал много сайтов и учебных пособий и не смог решить мою проблему. У меня есть приложение, которое работает до тех пор, пока я не попытаюсь прочитать из моей базы данных (оно открывается очень хорошо). Я знаю, что это неправильный способ сделать что-то, но у меня есть две глобальные строки, которые я передаю из своей основной деятельности в свой класс DataBaseHelper (DB_TABLE и spinnerPipeLengthText). Когда я вызываю следующую строку кода для извлечения данных из всех столбцов в определенной строке, мое приложение вылетает.

Cursor cursorData = myDataBase.query(CSSTPipeSizingActivity.DB_TABLE, null, 
            CSSTPipeSizingActivity.spinnerPipeLengthText, null, null, null, null, null);

Вот мой полный getData метод:

public Cursor getData() {

    Cursor cursorData = myDataBase.query(CSSTPipeSizingActivity.DB_TABLE, null, 
            CSSTPipeSizingActivity.spinnerPipeLengthText, null, null, null, null, null);
    if (cursorData != null)
        cursorData.moveToFirst();

    cursorData.moveToFirst();
    CSSTPipeSizingActivity.textViewSize15.setText(cursorData.getString(1));
    cursorData.moveToNext();        
    CSSTPipeSizingActivity.textViewSize19.setText(cursorData.getString(1));
    cursorData.moveToFirst();
    CSSTPipeSizingActivity.textViewSize25.setText(cursorData.getString(1));
    cursorData.moveToNext();        
    CSSTPipeSizingActivity.textViewSize31.setText(cursorData.getString(1));
    cursorData.moveToFirst();
    CSSTPipeSizingActivity.textViewSize37.setText(cursorData.getString(1));
    cursorData.moveToNext();        
    CSSTPipeSizingActivity.textViewSize46.setText(cursorData.getString(1));
    cursorData.moveToNext();        
    CSSTPipeSizingActivity.textViewSize62.setText(cursorData.getString(1));

    cursorData.close();
    return cursorData;
} // end method getData

Как вы можете видеть из моего кода, я пытаюсь взять данные и ввести их прямо в текстовые представления в файле main.xml. Я не знаю, возможно ли это, но это я выясню позже. Сейчас мне нужно получить данные.

Вот мой logcat:

03-12 19:23:33.587: D/AndroidRuntime(20191): Shutting down VM
03-12 19:23:33.587: W/dalvikvm(20191): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-12 19:23:33.617: E/AndroidRuntime(20191): FATAL EXCEPTION: main
03-12 19:23:33.617: E/AndroidRuntime(20191): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.skyesmechanical.CSSTPipeSizing/com.skyesmechanical.CSSTPipeSizing.CSSTPipeSizingActivity}: java.lang.NullPointerException
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.os.Looper.loop(Looper.java:123)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.app.ActivityThread.main(ActivityThread.java:3683)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at java.lang.reflect.Method.invokeNative(Native Method)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at java.lang.reflect.Method.invoke(Method.java:507)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at dalvik.system.NativeStart.main(Native Method)
03-12 19:23:33.617: E/AndroidRuntime(20191): Caused by: java.lang.NullPointerException
03-12 19:23:33.617: E/AndroidRuntime(20191):    at com.skyesmechanical.CSSTPipeSizing.DataBaseHelper.getData(DataBaseHelper.java:173)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at com.skyesmechanical.CSSTPipeSizing.CSSTPipeSizingActivity.onCreate(CSSTPipeSizingActivity.java:105)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-12 19:23:33.617: E/AndroidRuntime(20191):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-12 19:23:33.617: E/AndroidRuntime(20191):    ... 11 more

Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Ну, вы закрываете курсор и затем пытаетесь вернуть его ... не будет работать так хорошо.Либо закройте курсор и ничего не возвращайте, либо верните курсор.

Вы также продолжаете перебирать записи первой пары, когда выполняете movetofirst, movetonext, а затем movetofirst снова.

Я также считаю, что вам нужны getStringНебольшая помощь.

Вот как мне это сделать:

titleTxt.setText(eventedit.getString(eventedit
    .getColumnIndexOrThrow(AttendanceDB.EVENT_NAME)));

titleTxt - это ссылка на TextView, которую я установил ранее.eventEdit - курсор, от которого я хочу получить информацию (и созданный ранее)AttendanceDB мой класс адаптера БДEVENT_NAME - это переменная имени столбца, которую я установил в своем классе адаптера БД

РЕДАКТИРОВАТЬ

Хорошо, теперь, когда я перечитал ваш вопрос, я понял, что отвечаюнеправильная часть.Проблема в том, что ваш запрос испорчен.Я думаю, что это должно быть примерно так:

Cursor cursorData = myDataBase.query(CSSTPipeSizingActivity.DB_TABLE, null,  
    COLUMN_ID + "=" + CSSTPipeSizingActivity.spinnerPipeLengthText, null, null, null, null, null);                           

Вы должны указать в запросе, в каком столбце искать нужную информацию (CSSTPipeSizingActivity.spinnerPipeLengthText).Так что замените COLUMN_ID на имя вашего столбца или переменную для него, и вам будет хорошо.

Вы действительно должны просмотреть информацию здесь , особенно различные методы запроса и их обязательные параметры.

0 голосов
/ 13 марта 2012

Во-первых, подумайте, что вы можете поместить весь свой код, используя Курсор в операторе IF:

    if (cursorData != null){
        cursorData.moveToFirst();
        CSSTPipeSizingActivity.textViewSize15.setText(cursorData.getString(1));
        cursorData.moveToNext();        
        CSSTPipeSizingActivity.textViewSize19.setText(cursorData.getString(1));
        cursorData.moveToFirst();
        CSSTPipeSizingActivity.textViewSize25.setText(cursorData.getString(1));
        cursorData.moveToNext();        
        CSSTPipeSizingActivity.textViewSize31.setText(cursorData.getString(1));
        cursorData.moveToFirst();
        CSSTPipeSizingActivity.textViewSize37.setText(cursorData.getString(1));
        cursorData.moveToNext();        
        CSSTPipeSizingActivity.textViewSize46.setText(cursorData.getString(1));
        cursorData.moveToNext();        
        CSSTPipeSizingActivity.textViewSize62.setText(cursorData.getString(1));
        cursorData.close();
    }

Во-вторых, вы можете проверить ниже код b / c, к которому вы переходите дважды:

cursorData.moveToNext();        
CSSTPipeSizingActivity.textViewSize46.setText(cursorData.getString(1));
cursorData.moveToNext();        
CSSTPipeSizingActivity.textViewSize62.setText(cursorData.getString(1));

Наконец, используйте ваш setText с приведением типа String для всех методов setText:

CSSTPipeSizingActivity.textViewSize15.setText("" + cursorData.getString(1));
0 голосов
/ 13 марта 2012

Вы можете видеть из своей logcat, что ошибка - это исключение NullPointerException в строке 173. Без номеров строк в вашем коде трудно точно знать, в чем проблема в этом случае, но я предполагаю, что строка 173 - это cursorData.moveToFirst (), которого нет в операторе if.

Рассмотрим случай, когда cursorData имеет значение null -

Вы проверяете, что cursorData не является нулевым, и если это так, вы вызываете moveToFirst().Но затем вы вызываете moveToFirst () в следующей строке;это произойдет независимо от того, имеет ли значение cursorData значение NULL или нет.

Обычным шаблоном проектирования будет для getData просто вернуть курсор, а для вызывающего метода обработать извлечение.Это может выглядеть примерно так:

{... if (cursorData! = Null) cursorData.moveToFirst ();вернуть cursorData;}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...