2013-05-05 3 views
0

Добрый вечер всем, у меня есть пролема, я думаю, с извлечением контента ценности в базе данных Android.Извлечение данных из базы данных SQL без успеха

Прежде всего, я попробовал приложение на устройстве (SGS3), и база данных правильно создает и заполняется запросом, но когда я пытаюсь вызвать извлечение из курсора значения, LogCat даст мне ошибку NullPointerExeption , Я прочитал некоторые другие темы, но я не нашел ответа на свою проблему.

Это код для создания базы данных, запроса и позиции данных:

public static Cursor fetchProducts(){ //attenzione cambioato,messo static 
     return mDb.query(PositionsMetaData.POSITIONS_TABLE, null,null,null,null,null,null);    
} 

static class PositionsMetaData { 
     static final String POSITIONS_TABLE = "position"; 
     static final String ID = "_id"; 
     static final String POSITIONS_NAME_KEY = "name"; 
     static final String POSITIONS_LATITUDE_KEY = "lat"; 
     static final String POSITIONS_LONGITUDE_KEY = "lon"; 
} 

private static final String POSITIONS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " 
       + PositionsMetaData.POSITIONS_TABLE + " (" 
       + PositionsMetaData.ID + " integer primary key autoincrement, " 
       + PositionsMetaData.POSITIONS_NAME_KEY + " text, " 
       + PositionsMetaData.POSITIONS_LATITUDE_KEY + " double not null, " 
       + PositionsMetaData.POSITIONS_LONGITUDE_KEY + " double not null); "; 

Незнайка почему, но затмение хочет курсор с статичным, я не уверен в этом и почему это, кстати, Тхи код для извлечения данных:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listagps); 

     TextView nomelista=(TextView)findViewById(R.id.nomelista); 
     TextView latitudinelista=(TextView)findViewById(R.id.latitudinelista); 
     TextView longitudinelista=(TextView)findViewById(R.id.longitudinelista); 


     // CREAZIONE LISTA PUNTI GPS SU LAYOUT LISTAGPS 

     ListView posizionigps=(ListView)findViewById(R.id.listagps); 

     final listagpsdb db = new listagpsdb(getApplicationContext()); 

     db.open(); 

     Cursor c=listagpsdb.fetchProducts(); 
     startManagingCursor(c); 

     @SuppressWarnings("deprecation") 
     SimpleCursorAdapter adapter=new SimpleCursorAdapter (
       this, 
       R.layout.listagps_item, 
       c, 
       new String[]{listagpsdb.PositionsMetaData.POSITIONS_NAME_KEY,listagpsdb.PositionsMetaData.POSITIONS_LONGITUDE_KEY,listagpsdb.PositionsMetaData.POSITIONS_LATITUDE_KEY}, 
       new int []{R.id.nomelista,R.id.longitudinelista,R.id.latitudinelista}); 

     posizionigps.setAdapter(adapter); 

     int nomecol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_NAME_KEY); 
     int loncol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_LONGITUDE_KEY); 
     int lancol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_LATITUDE_KEY); 


     if(c.moveToFirst()){ 
      do { 
       nomelista.append(c.getString(nomecol)); 
       latitudinelista.append(c.getString(lancol)); 
       longitudinelista.append(c.getString(loncol)); 

      } while (c.moveToNext()); 

      } 

     db.close(); 

    } 


    } 

LogCat дает мне ошибку для nomelista, latitudinelista и longitudinelista, весь нуля, но в БД все заселены.

Любые предложения по решению этой проблемы? Неправильное управление курсором или потому, что текстовое представление не задано данными? Я пробовал бесконечно, я знаю, но без успеха.

Большое спасибо всем, хотят, чтобы помочь мне :)

ПОЛНЫЙ LogCat ПРОБЛЕМЫ

05-05 14:42:22.613: E/AndroidRuntime(988): FATAL EXCEPTION: main 
05-05 14:42:22.613: E/AndroidRuntime(988): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.drive.info/com.drive.info.listagps}: java.lang.NullPointerException 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.os.Looper.loop(Looper.java:137) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.ActivityThread.main(ActivityThread.java:4745) 
05-05 14:42:22.613: E/AndroidRuntime(988): at java.lang.reflect.Method.invokeNative(Native Method) 
05-05 14:42:22.613: E/AndroidRuntime(988): at java.lang.reflect.Method.invoke(Method.java:511) 
05-05 14:42:22.613: E/AndroidRuntime(988): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
05-05 14:42:22.613: E/AndroidRuntime(988): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
05-05 14:42:22.613: E/AndroidRuntime(988): at dalvik.system.NativeStart.main(Native Method) 
05-05 14:42:22.613: E/AndroidRuntime(988): Caused by: java.lang.NullPointerException 
05-05 14:42:22.613: E/AndroidRuntime(988): at com.drive.info.listagps.onCreate(listagps.java:68) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.Activity.performCreate(Activity.java:5008) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
05-05 14:42:22.613: E/AndroidRuntime(988): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
05-05 14:42:22.613: E/AndroidRuntime(988): ... 11 more 
+0

Пожалуйста, добавьте сюда свой полный ловушка. – Sajmon

+0

Добавлено в основной пост полный логарифм :) Строка 68 - это строка nomelista.append (c.getString (nomecol)); –

+0

Похоже, что номенклатура TextView имеет значение null. Является ли номелиста оскверненной в R.layout.listagps? – bakriOnFire

ответ

0

Вы должны сначала надуть R.layout.listagps_item, а затем использовать этот надутый вид to findViewById ваших текстовых просмотров.

Что-то вроде этого: -

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listagps); 

LayoutInflater li = getLayoutInflater(); 
View vListItems = li.inflate(R.layout.listagps_item, null); 

    TextView nomelista=(TextView) vListItems.findViewById(R.id.nomelista); 
    TextView latitudinelista=(TextView) vListItems.findViewById(R.id.latitudinelista); 
    TextView longitudinelista=(TextView) vListItems.findViewById(R.id.longitudinelista); 


    // CREAZIONE LISTA PUNTI GPS SU LAYOUT LISTAGPS 

    ListView posizionigps=(ListView)findViewById(R.id.listagps); 

    final listagpsdb db = new listagpsdb(getApplicationContext()); 

    db.open(); 

    Cursor c=listagpsdb.fetchProducts(); 
    startManagingCursor(c); 

@SuppressWarnings("deprecation") 
    SimpleCursorAdapter adapter=new SimpleCursorAdapter (
      this, 
      vListItems, 
      c, 
      new String[]{listagpsdb.PositionsMetaData.POSITIONS_NAME_KEY,listagpsdb.PositionsMetaData.POSITIONS_LONGITUDE_KEY,listagpsdb.PositionsMetaData.POSITIONS_LATITUDE_KEY}, 
      new int []{R.id.nomelista,R.id.longitudinelista,R.id.latitudinelista}); 

    posizionigps.setAdapter(adapter); 

    int nomecol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_NAME_KEY); 
    int loncol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_LONGITUDE_KEY); 
    int lancol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_LATITUDE_KEY); 


    if(c.moveToFirst()){ 
     do { 
      nomelista.append(c.getString(nomecol)); 
      latitudinelista.append(c.getString(lancol)); 
      longitudinelista.append(c.getString(loncol)); 

     } while (c.moveToNext()); 

     } 

    db.close(); 

} 
} 

В приведенном выше коде, что я изменить это, я уже раздули R.layout.listagps_item в представление с именем vListItems и использовал этот вид объекта findViewById из nomelista, longitudinelista и latitudinelista.

Также обратите внимание, что я также передал vListItems в SimpleCursorAdapter insted из R.layout.listagps_item.

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

+0

с вашей помощью теперь я решил, что ошибка дала мне! Большое спасибо и, естественно, лучший ответ, но у меня есть вопрос, чтобы избежать будущей ошибки. Вы использовали layoutInflater, и теперь я прочитал некоторые на сайте Android. В чем отличие от setContentView? С помощью setContentView вы определяете, какой макет используется активностью, но не обрабатывает макет в другом макете? Для будущего случая, аналогично этому, я должен использовать только LayoutInflater и с findViewById я ищу объект внутри этого экземпляра? Теперь я должен понять, почему курсор читает только первую строку :) –

+0

сам setContentView() раздувает макет, который проходит в нем.И если вы хотите создать объект представлений, которые не находятся в макете активности (т. Е. SetContentView() этого действия), вам придется раздуть этот макет и использовать объект этого раздутого макета для findViewByIds его представлений. – bakriOnFire

+0

Да, теперь я понял, что setContentView() задает общий макет активности, но если я хочу вставить некоторые элементы не в исходном макете, мне нужно раздуть второе, а в действии вызовите объект во втором с помощью findviewbyid. Thx много;) –

Смежные вопросы