尝试调用虚方法:SQLite

时间:2017-09-21 01:28:03

标签: java android nullpointerexception android-sqlite

我正在努力使用CAMERA2 API和SQLite。捕获视频后,剪辑名称必须保存在数据库中。这些是我想要弄清楚的步骤。

1.在视频捕获类中,将调用db活动类

    VS_dbActivity dbActivity = new VS_dbActivity();
    String msg = dbActivity.sendData(mNextVideoAbsolutePath);

2.在尝试将mNextVideoAbsolutePath发送到db

的dbActivity类中
public class VS_dbActivity extends AppCompatActivity{

private VS_dbConfig dbHelp;

public String sendData(String filePath) {
    dbHelp = new VS_dbConfig(this);
    SQLiteDatabase db = dbHelp.getWritableDatabase();
    // some example
}

}

在上面提到的类中,我没有添加构造函数。是否有必要添加构造函数?如果不使用构造函数会发生什么。

当我运行此应用时,它会在

中显示错误
SQLiteDatabase db = dbHelp.getWritableDatabase();

错误日志:---->>

FATAL EXCEPTION: main
                                                                                Process: com.android.ejsoft.video_upload_000web, PID: 334
                                                                                java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
                                                                                    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:274)
                                                                                    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
                                                                                    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
                                                                                    at com.android.ejsoft.video_upload_000web.dbManage.VS_dbActivity.sendData(VS_dbActivity.java:28)
                                                                                    at com.android.ejsoft.video_upload_000web.Camera2VideoFragment.sendFilePath(Camera2VideoFragment.java:578)
                                                                                    at com.android.ejsoft.video_upload_000web.Camera2VideoFragment.access$1200(Camera2VideoFragment.java:60)
                                                                                    at com.android.ejsoft.video_upload_000web.Camera2VideoFragment$4$2.onInfo(Camera2VideoFragment.java:555)
                                                                                    at android.media.MediaRecorder$EventHandler.handleMessage(MediaRecorder.java:1159)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                    at android.os.Looper.loop(Looper.java:135)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5753)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

不管怎么说没有做构造函数来获取活动的上下文?感谢您宝贵的时间。

1 个答案:

答案 0 :(得分:2)

如果某些内容不是活动,请不要延长活动!

您可以将有效的Context传递给此方法或类的构造函数。不要只是思考"我需要this成为一个上下文,所以我只是将它作为一个活动"。

public class VS_dbHelper {

    private final VS_dbConfig dbHelp;

    public VS_dbHelper(Context c) {
        dbHelp = new VS_dbConfig(c);
    } 

    public String sendData(String filePath) {
        // For example 
        SQLiteDatabase db = dbHelp.getWritableDatabase();
    } 

您现在需要new VS_dbHelper(MainActivity.this)来正确获取上下文

或者,您可以将sendData方法移动到已经是您的SqliteOpenHelper的VS_dbConfig类中。没有理由将数据库助手隐藏在另一个

之后