【问题标题】:Android Error [Attempt to invoke Boolean virtual method 'void DatabaseHelper.Insert()'' on a null object reference] [duplicate]Android错误[尝试在空对象引用上调用布尔虚拟方法'void DatabaseHelper.Insert()''] [重复]
【发布时间】:2015-11-24 17:11:50
【问题描述】:

我有两个类,我试图通过我创建的 getter 和 setter 将我的值传递到其他类中以插入到 db 中,但是我得到了异常并且我的应用程序在我单击保存按钮后立即崩溃..请有人看看它已经三天了我似乎无法解决它谢谢 这是我的两个课程:

/**
 * Created by Sanya on 11/22/2015.
 */
                   public class User_overlay_save extends Activity implements View.OnClickListener
  {
    private static int RESULT_LOAD_IMAGE = 1;
    private static int RESULT_LOAD_VIDEO = 2;
    private int position = 0;
    private SQLiteDatabase db; DatabaseHelper helper;
    File myapp;
    private MediaController mediaControls;

    Button save_button;
    ImageButton vid_button,img_button;
    EditText  name_overlay;
   TextView real_Imgpath, real_Vidpath;

protected void onCreate(Bundle savedInstanceState){
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_overlay_save);

    save_button=(Button)findViewById(R.id.save_Ouser);

    img_button=(ImageButton)findViewById(R.id.img_button);
    vid_button=(ImageButton)findViewById(R.id.vid_button);

    real_Imgpath =(TextView)findViewById(R.id.real_Imgpath);
    real_Vidpath =(TextView)findViewById(R.id.real_Vidpath);

    name_overlay=(EditText)findViewById(R.id.name_overlay);

    save_button.setOnClickListener(this);
    img_button.setOnClickListener(this);
    vid_button.setOnClickListener(this);

    name_overlay.setOnClickListener(this);

        }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.save_Ouser:
            {
               boolean result= helper.Insert();

                if(result==true)
                {
                    Toast.makeText(getApplicationContext(), "saved..in DB..!!!",
                            Toast.LENGTH_LONG).show();
                }
else
                {
                    Toast.makeText(getApplicationContext(), "ERROR--the path could not b saved..!!",
                            Toast.LENGTH_LONG).show();
                }
            }


            break;
            case R.id.img_button:

                Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

               startActivityForResult(i, RESULT_LOAD_IMAGE);
                break;
            case R.id.vid_button:
                Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, RESULT_LOAD_VIDEO);

                break;

        }
    }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            String realPath;
//FOR IMAGE PATH SAVING
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
            String selectedImagePath;
            Uri selectedImageUri = data.getData();

//媒体库

     selectedImagePath =       ImageFilePath.getPath(getApplicationContext(), selectedImageUri);
        Log.i("Image-->File Path-->", " " + selectedImagePath);
        setImgTextViews(Build.VERSION.SDK_INT, selectedImagePath);
        SET_saveImg(selectedImagePath);
    }
          else if(Build.VERSION.SDK_INT < 19)
            {
            realPath = this.getRealPathFromURI_FromAPI11_18(this, data.getData());
                setImgTextViews(Build.VERSION.SDK_INT, realPath);
            }
//----------->>>>>>>>>>>---------->>>>FOR VIDEO PATH SAVING------>>>>>>------------>>>>>>>>>>>-------->>>>>>>>>---------->>>>

        if (requestCode == RESULT_LOAD_VIDEO && resultCode == RESULT_OK && null != data)
        {
//FOR VIDEO PATH SAVING
            String selectedVidPath;
            Uri selectedVidUri = data.getData();

//VIDEO____PLAY___LIST
            selectedVidPath = ImageFilePath.getPath(getApplicationContext(), selectedVidUri);
            Log.i("VIDEO-->File Path-->", "" + selectedVidPath);
            setVIDTextViews(Build.VERSION.SDK_INT, selectedVidPath);
            SET_saveVid(selectedVidPath);
        }
    }

    public String getRealPathFromURI_FromAPI11_18(Context context, Uri contentUri)
    {
        String[] proj = { MediaStore.Images.Media.DATA };
        String result = null;

        CursorLoader cursorLoader = new CursorLoader(context, contentUri, proj, null, null, null);
        Cursor cursor = cursorLoader.loadInBackground();

        if(cursor != null){
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            result = cursor.getString(column_index);
        }
        return result;
    }


    protected void setImgTextViews(int sdk,String realPath){


    this.real_Imgpath.setText
           ("CURRENT VERSION--SDK-->"+sdk+"Real Path: "+realPath);

}
         protected void setVIDTextViews(int sdk,String realPath)
    {
               this.real_Vidpath.setText
            ("CURRENT VERSION--SDK-->"+sdk+"Real Path: "+realPath);
    }

//---->>------>>>------->>>>SETTERS--FOR IMAGE-->SET_saveImg(selectedImagePath) For &VIDEO -->>SET_saveVid(selectedVidPath)--->>AND--->>GETTERS FOR IMAGE AND VIDEO--------->>>>>

String realPath; String vidPath;
public String GET_saveImg()//IS CALLED FROM DATABASE_HELPER CLASS TO PROVIDE THE SETTER VALUES
{
    return realPath;
}

protected void SET_saveImg(String realPath)
{
    this.realPath=realPath;

}
      protected String GET_saveVid()
{
    return vidPath;
}
     protected void SET_saveVid(String vidPath)
{
  this.vidPath= vidPath;
}}

--------->>>>>>> >>>>--------- DATABASEHELPER_class

 import android.content.ContentValues;
         import android.content.Context;
         import android.database.sqlite.SQLiteDatabase;
         import android.database.sqlite.SQLiteOpenHelper;


       public class DatabaseHelper extends SQLiteOpenHelper {
          SQLiteDatabase db;    User_overlay_save obj ;


      // Database Name
      public static String DATABASE_NAME = "MY_database.sql";

// Current version of database
private static final int DATABASE_VERSION = 1;

// Name of table
private static final String TABLE_Images = "images";

// All Keys used in table
 static final String KEY_ID = "id";
 static final String KEY_IMAGE = "image";
 static final String KEY_FILE = "file";


public static String TAG = "tag";

private static final String CREATE_TABLE_Images = "CREATE TABLE "
        + TABLE_Images + "(" + KEY_ID
        + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_IMAGE + "TEXT" +            KEY_FILE + " TEXT );";

      public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
         }
   /*This method is called by system if the database is accessed but not   yet created*/



 @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(CREATE_TABLE_Images); // create Image table

    }


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int  newVersion)    {
    db.execSQL("DROP TABLE IF EXISTS " + CREATE_TABLE_Images); 
                            // drop               table if exists

    onCreate(db);
      }

   public boolean Insert()
   {      boolean success = false;

    String imgpath = obj.GET_saveImg();
    String vidPath = obj.GET_saveVid();

    db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_IMAGE, imgpath);
    values.put(KEY_FILE, vidPath);

    db.insert(TABLE_Images, null, values);

    success=true;
    db.close();

if(success) {
    return true;
}
else
{
    return false;
}
}
}

【问题讨论】:

    标签: java android database sqlite import


    【解决方案1】:

    您的 DatabaseHelper 对象助手是 null。因为你只是声明了它,没有在任何地方定义。

    输入helper = new DatabaseHelper(any arguments if there it is); 在保存按钮上设置 onClickListener 之前在 onCreate 内。

    protected void onCreate(Bundle savedInstanceState){
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.user_overlay_save);
    
            ...........................
            helper = new DatabaseHelper();
            save_button.setOnClickListener(this);
    
            ..................
    
    }
    

    【讨论】:

    • 感谢@bhargav 的回复我试过了,但现在它给出了sqlite E/ActivityThread 的例外:在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:740) 11 -24 22:55:40.905 15416-15416/com.example.sanya.ar_expeditor E/SQLiteLog:(1)表图像没有名为图像的列 SQLiteDatabase:插入图像时出错=空文件=空SQLiteDatabase:android.database.sqlite.SQLiteException : 表图像没有名为 image 的列 (代码 1): ,编译时: INSERT INTO images(image,file) VALUES (?,?)
    • 感谢您的帮助,它解决了所需的问题.. :)
    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多