【问题标题】:Null exception in android while using database使用数据库时android中的空异常
【发布时间】:2013-01-01 10:53:04
【问题描述】:

我正在尝试在 android 中编写更可靠的代码,因此我为不同的目的创建了不同的类,例如用于连接 db、创建表的单独类以及用于插入更新和删除的类。现在我遇到了 SQLiteDatabase [mDb] 的问题:我有一个类,其中有表列的 getter 和 setter,即接收者.class。现在我必须将数据插入数据库,所以我这样做是为了插入:

public long insert(Recipient recipient, String[] images){
        ContentValues initialValues = new ContentValues();
        initialValues.put(FLD_RECIPIENT_ID, Recipient.getFldRecipientId());
        initialValues.put(FLD_INFO, Recipient.getFldInfo());
        initialValues.put(FLD_LATITUDE, Recipient.getFldLatitude());
        initialValues.put(FLD_LONGITUDE, Recipient.getFldLongitude());
        for(int i=0;i<images.length;i++){
            if(images[i]!=null){
                initialValues.put("FLD_IMAGE_URL"+(i+1), images[i]);
            }
        }
        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

当我调试所有的 initialValues 值时,当执行 mDb.insert 时,它退出显示 nullPointException 和 mDb null 的值。我不明白为什么会这样。所以如果有人可以帮助我??? 我还将 mDb 初始化为:

private SQLiteDatabase mDb;

LOGCAT:

01-01 11:11:27.963: E/AndroidRuntime(992): FATAL EXCEPTION: main
01-01 11:11:27.963: E/AndroidRuntime(992): java.lang.NullPointerException
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.example.android.photobyintent.DbReceipient.insert(DbReceipient.java:43)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.example.android.photobyintent.AddRecipient.insertIntoDb(AddRecipient.java:451)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.example.android.photobyintent.AddRecipient$4.onClick(AddRecipient.java:409)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.view.View.performClick(View.java:4202)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.view.View$PerformClick.run(View.java:17340)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.os.Handler.handleCallback(Handler.java:725)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.os.Looper.loop(Looper.java:137)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.app.ActivityThread.main(ActivityThread.java:5039)
01-01 11:11:27.963: E/AndroidRuntime(992):  at java.lang.reflect.Method.invokeNative(Native Method)
01-01 11:11:27.963: E/AndroidRuntime(992):  at java.lang.reflect.Method.invoke(Method.java:511)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-01 11:11:27.963: E/AndroidRuntime(992):  at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 在使用mDb插入数据之前,只需检查其null与否,如果为null,则以可写模式打开数据库。
  • private SQLiteDatabase mDb; 这是一份声明。定义在哪里?
  • 你在清单中有读/写权限吗?请显示 logcat。
  • 是的,我在清单中有读/写权限
  • Recipient.getFldRecipientId() no get value print log for check value is come or not..

标签: android sqlite nullpointerexception


【解决方案1】:

在 mDB 上执行此操作。

private SQLiteDatabase mDb = this.getWritableDatabase();

【讨论】:

    【解决方案2】:

    在插入数据库之前初始化mDb

    public long insert(Recipient recipient, String[] images){
             mDb = Your_sqLiteHelper.getWritableDatabase();
    
             // your code here
    
            return mDb.insert(DATABASE_TABLE, null, initialValues);
        }
    

    【讨论】:

      【解决方案3】:

      我认为 mDb 在您访问它之前未初始化或其为空。 试试:

      函数前 mDb = this.getWritableDatabase();

      public long insert(Recipient recipient, String[] images){
          ContentValues initialValues = new ContentValues();
          initialValues.put(FLD_RECIPIENT_ID, Recipient.getFldRecipientId());
          initialValues.put(FLD_INFO, Recipient.getFldInfo());
          initialValues.put(FLD_LATITUDE, Recipient.getFldLatitude());
          initialValues.put(FLD_LONGITUDE, Recipient.getFldLongitude());
          for(int i=0;i<images.length;i++){
              if(images[i]!=null){
                  initialValues.put("FLD_IMAGE_URL"+(i+1), images[i]);
              }
          }
           if(mdb!=null){
               return mDb.insert(DATABASE_TABLE, null, initialValues);
           }else {
               return null;
           }
      }
      

      如果返回值为 null 则相应地工作。

      【讨论】:

        【解决方案4】:

        最好以原子方式使用数据库对象,在需要时打开它,在不再需要时立即关闭它

        试试这样:

        SQLiteDatabase db = opener.getWritableDatabase();
        
            try {
                ContentValues values = new ContentValues();
                /* set values */
        
                return db.insertOrThrow(tableName, null, values);
            } finally {
                db.close();
            }
        

        【讨论】:

          【解决方案5】:

          在您调用insert 方法时,您的mDb 成员变量似乎没有初始化(即它仍然是null)。

          这个变量在你的班级哪里分配?也许您创建了另一个方法,命名为 connect,但您忘记在 insert 之前调用它?

          您需要展示更多您班级的代码,然后我才能提供更多帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多