0

大家晚上好,我有一个问题,我想,在我的 Android 数据库中提取价值内容。

首先,我已经在设备(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); ";

不知道为什么,但是eclipse想要带有静态的光标,我不确定这个以及为什么这个,顺便说一下,这是提取数据的代码:

@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 的错误,所有这些都为空,但在数据库中都已填充。

有什么建议可以解决这个问题吗?是光标管理不正确还是因为 textview 没有设置数据?我已经尝试了我所知道的一切,但没有成功。

非常感谢所有想帮助我的人:)

问题的完整记录

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
4

1 回答 1

0

您必须先为 R.layout.listagps_item 充气,然后使用此充气视图来查找文本视图的 ViewById。

像这样的东西: -

@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(); 

}
}

在上面的代码中,我改变的是,我在一个名为 vListItems 的视图中膨胀了 R.layout.listagps_item,并使用这个视图对象来查找 nomelista、longitudinelista 和 latitudinelista 的 ViewById。

另请注意,我还通过了 R.layout.listagps_item 的 SimpleCursorAdapter 中的 vListItems。

希望这可以帮助。

于 2013-05-05T16:05:00.757 回答