【问题标题】:nullpointerexception at sqlite populating a listview in android在sqlite填充android中的列表视图时出现nullpointerexception
【发布时间】:2023-03-13 22:36:01
【问题描述】:

我有这个代码:

package com.rbrlnx.lugares;

public class DataBaseHelper extends SQLiteOpenHelper {

    private static String DB_PATH = "/data/data/com.rbrlnx.lugares/databases/";
    private static final String DATABASE_NAME="db.db";
    SQLiteDatabase db;

     String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS lugares (" +
         "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
         "nombre text NOT NULL," +
         "descripcion text NOL NULL,"+
         "latitud real," +
         "longitud real," +
         "foto String);";

     /*Primero se crea constructor, funcion onCreate, onUpgrade,Abrir y Cerrar*/

     public  DataBaseHelper(Context context){
        super(context,DATABASE_NAME,null,1);
     }

     public void onCreate(SQLiteDatabase db){
         db.execSQL(CREATE_TABLE);
     }

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

     db.execSQL("DELETE TABLE IF EXITS "+DATABASE_NAME+"");
     onCreate(db);
    }
    public void openDataBase() throws SQLException{

        //Open the database
        String myPath = DB_PATH + DATABASE_NAME;
        db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

    }    

     public void close(){
         db.close();
     }


    /*Despues metodos para añadir y obtener datos*/

    public long addNombre(String nombre){

    ContentValues cv = new ContentValues();
    cv.put("nombre", nombre);
    return db.insert("lugares", null, cv);           
    }

         public long addDescripcion(String descripcion){

             ContentValues cv = new ContentValues();
                cv.put("descripcion", descripcion);
                return db.insert("lugares", null, cv);           

         }
         public long addLatitud(double latitud){

             ContentValues cv = new ContentValues();
                cv.put("latitud", latitud);
                return db.insert("lugares", null, cv);           

         }
         public long addLongitud(double longitud){

             ContentValues cv = new ContentValues();
                cv.put("longitud", longitud);
                return db.insert("lugares", null, cv);           

         }

         public long addFoto(String foto) {

             ContentValues cv = new ContentValues();
                cv.put("foto", foto);
                return db.insert("lugares", null, cv);           

            }


         public Cursor getNombres(){
               Cursor respuesta = db.rawQuery("select nombres from lugares", null);

               return respuesta;

           }
         public long addImagen(Uri directorioimagen){

             String imagen = getRealPathFromURI(directorioimagen);           
            ContentValues cv = new ContentValues();
            cv.put("foto", imagen);
            return db.insert("lugares", null, cv);           


         }







        }

还有这个

public class listatab extends ListActivity{ 

        Context context;
        ListView listanombres;
        DataBaseHelper ayudabbdd;


      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        Cursor nombresC;
         nombresC = ayudabbdd.getNombres();  
         startManagingCursor(nombresC);
         ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.listatab, nombresC, new String[] { "nombre" }, new int[] { R.id.lista });
         this.setListAdapter(adapter);
         this.getListView().setTextFilterEnabled(true);  


      }
      @Override
    protected void onDestroy() {
        super.onDestroy();
        if (ayudabbdd != null) {
            ayudabbdd.close();
        }
}
}

并且 log cat 给我这个错误

10-10 21:25:38.115: ERROR/Database(26775): close() was never explicitly called on database '/data/data/com.rbrlnx.lugares/databases/db.db' 
10-10 21:25:38.115: ERROR/Database(26775): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

10-10 21:35:48.831: ERROR/AndroidRuntime(27458): FATAL EXCEPTION: main
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rbrlnx.lugares/com.rbrlnx.lugares.listatab}: java.lang.NullPointerException
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1872)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1692)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:656)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.widget.TabHost.setCurrentTab(TabHost.java:326)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:458)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.view.View.performClick(View.java:2533)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.view.View$PerformClick.run(View.java:9320)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.os.Handler.handleCallback(Handler.java:587)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.os.Looper.loop(Looper.java:150)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.app.ActivityThread.main(ActivityThread.java:4389)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at java.lang.reflect.Method.invokeNative(Native Method)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at java.lang.reflect.Method.invoke(Method.java:507)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at dalvik.system.NativeStart.main(Native Method)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458): Caused by: java.lang.NullPointerException
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at com.rbrlnx.lugares.listatab.onCreate(listatab.java:21)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836)
10-10 21:35:48.831: ERROR/AndroidRuntime(27458):     ... 18 more

不知道为什么,谁能帮帮我?

【问题讨论】:

  • 在自己的线程中重新抛出异常更容易调试android应用程序,因为android活动只是抛出RuntimeExceptions而不保留stacktrace。
  • 另外,您在查询中写了“NOL NULL”
  • 抛出异常时如何调试android应用程序? db.db 有数据。我删除了查询中的 not null
  • 它?那是什么意思?您可以将eclipse与模拟器一起使用,因此很容易调试...
  • 但是我可以停在例外行吗?(对不起我的英语)

标签: android sqlite nullpointerexception


【解决方案1】:

您没有创建 DataBaseHelper 实例。你需要:

ayudabbdd = new DataBaseHelper(this);

在调用getNombers() 方法之前。

【讨论】:

  • 我错误地删除了这一行,但与该行结果相同
【解决方案2】:

使用它

DataBaseHelper ayudabbdd=new DataBaseHelper(this);
    SQLiteDatabase db=ayudabbdd.getReadableDatabase();
    Cursor cur=db.<Method Name which you want to use>;

但我不知道有什么用

 nombresC = ayudabbdd.getNombres(); 

您在创建表格时有很多拼写错误,在检查后也要删除它们,

   like nol null in place of not null

【讨论】:

    【解决方案3】:

    在调用db.execSQL之前,您需要在onCreate中手动调用openDataBase

         public void onCreate(SQLiteDatabase db){
             try {
                 openDataBase();
                 db.execSQL(CREATE_TABLE);
             } catch (Exception e) {
                // handle exception
             }             
         }
    

    同样,您的onUpgrade 方法需要在调用db.execSQL 之前先打开数据库,否则您将得到相同类型的错误。而且我认为您不应该从onUpgrade 手动调用onCreate,找出一种不同的方式来完成您正在尝试的事情。

    【讨论】:

    • ERROR/AndroidRuntime(380): java.lang.RuntimeException: ComponentInfo{com.rbrlnx.lugares/com.rbrlnx.lugares.listatab}: java.lang.NullPointerException ERROR/AndroidRuntime(380):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 10-10 23:21:09.460: ERROR/AndroidRuntime(380): Caused by: java.lang.NullPointerException 10-10 23:21:09.460: ERROR/ AndroidRuntime(380):在 com.rbrlnx.lugares.DataBaseHelper.getNombres(DataBaseHelper.java:111) 10-10 23:21:09.460:错误/AndroidRuntime(380):在 com.rbrlnx.lugares.listatab.onCreate(listatab .java:22) 相同的结果..
    • 我用 sqlite 编辑器打开了 db.db,我手动添加了寄存器,在 eclipse 中,如果在文件 explore 中使用 de ddms 透视图,我可以看到 db.db 有很多寄存器。
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 2017-08-18
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多