2017-09-21 5 views
-3

Je suis aux prises avec l'API CAMERA2 et SQLite. Après la capture de la vidéo, le nom du clip doit être enregistré dans la base de données. Ce sont les étapes que j'essaie de comprendre.Tentative d'invocation de la méthode virtuelle: SQLite

1.In la classe de capture vidéo, appellera pour les activités db classe

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

2.In la classe dbActivity essayant d'envoyer mNextVideoAbsolutePath dans db

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 
} 

}

Dans la classe mentionnée ci-dessus, je n'ai pas ajouté le constructeur. Est-il nécessaire d'ajouter un constructeur? Que se passe-t-il si vous n'avez pas utilisé le constructeur.

Quand je lance cette application, il apparaît erreur dans

SQLiteDatabase db = dbHelp.getWritableDatabase(); 

journal d'erreur: ---- >>

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) 

est-ce pas là de toute façon sans faire le constructeur pour obtenir la contexte de l'activité? Merci pour votre temps précieux.

+0

Pouvez-vous mettre le journal des erreurs? –

+0

J'ai ajouté le journal d'erreur @ king_abu1918 –

+0

Vous ne pouvez pas simplement créer une nouvelle classe Activity et appeler des méthodes. Pourquoi pensez-vous que c'est correct? –

Répondre

2

Si quelque chose n'est pas une activité, ne prolongez pas une activité!

Vous pouvez transmettre un contexte valide dans cette méthode ou un constructeur de la classe. Ne pensez pas simplement "J'ai besoin de this pour être un contexte, alors je vais en faire une activité".

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

Et vous avez besoin maintenant new VS_dbHelper(MainActivity.this) pour obtenir le contexte correctement

Alternativement, vous pouvez déplacer la méthode sendData dans la classe VS_dbConfig qui est déjà votre SqliteOpenHelper, il semble. Il n'y a aucune raison de cacher votre assistant de base de données derrière un autre