2016-12-24 20 views
-4

このプロジェクトでは大きな問題があります。 このプロジェクトでは、dbデータをSQLiteに読み込みたいと思っています。Android -getFileDir()によりNullPointer例外が発生する

しかし、エラーが発生しました。

src→main→assetsフォルダにdbデータ(last.db)を入れます。

Process: net.macdidi.lasttest, PID: 4829 
       java.lang.ExceptionInInitializerError 
        at net.macdidi.lasttest.MainActivity.onCreate(MainActivity.java:20) 
        at android.app.Activity.performCreate(Activity.java:6262) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2458) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2565) 
        at android.app.ActivityThread.access$900(ActivityThread.java:150) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1395) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:168) 
        at android.app.ActivityThread.main(ActivityThread.java:5821) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 
       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getFilesDir()' on a null object reference 
        at net.macdidi.lasttest.DatabaseHelper.<clinit>(SQLiteOpenHelper.java:18) 
        at net.macdidi.lasttest.MainActivity.onCreate(MainActivity.java:20)  
        at android.app.Activity.performCreate(Activity.java:6262)  
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)  
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2458)  
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2565)  
        at android.app.ActivityThread.access$900(ActivityThread.java:150)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1395)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:168)  
        at android.app.ActivityThread.main(ActivityThread.java:5821)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)  

、これは私のコード

class DatabaseHelper extends SQLiteOpenHelper { 
private static Context context; 
private static String DB_PATH = context.getFilesDir().getAbsolutePath(); 
private static String DB_NAME = "last.db"; 

private final Context mCtx; 
public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.mCtx = context; 
} 
public boolean createDatabase() { 
    boolean dbExist = checkDatabase(); 
    this.getReadableDatabase(); 
    if (dbExist == false) { 
     if (copyDatabase() == false) { 
      return false; 
     } 
    } 
    return true; 
} 
private boolean checkDatabase() { 
    SQLiteDatabase checkDB = null; 
    String dbpath = DB_PATH + DB_NAME; 
    try { 
     checkDB = SQLiteDatabase.openDatabase(dbpath, 
       null, SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
     return false; 
    } 
    if (checkDB != null) { 
     checkDB.close(); 
     return true; 
    } 
    return false; 
} 
private boolean copyDatabase() { 
    try { 
     InputStream input = mCtx.getAssets().open(DB_NAME); 
     this.getReadableDatabase(); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream output = 
       new FileOutputStream(outFileName); 
     byte [] buffer = new byte[1024]; 
     int length; 
     while ((length = input.read(buffer)) > 0) { 
      output.write(buffer, 0, length); 
     } 
     output.flush(); 
     output.close(); 
     input.close(); 
    } catch (Exception e) { 
     return false; 
    } 
    return true; 
} 
public void onCreate(SQLiteDatabase db) { 
} 
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { 
} 

}

である私は深く、誰かが私のために、この大きな問題を解決するために私を助けることができると思います。

+3

ええコンテキストは、文字列DB_PATH = context.getFilesDir 'でヌルである()' –

答えて

0
private static String DB_PATH = context.getFilesDir().getAbsolutePath(); 

まず、contextは、この時点でnullです。

第2に、Activityから継承したメソッドをフィールド初期化子から呼び出さないでください。 onCreate()まで、通常はsuper.onCreate()の後に作業を延期します。

そうで、その行を置き換える:追加、

private static String DB_PATH; 

onCreate()で:

いっそ
DB_PATH=getFilesDir().getAbsolutePath(); 

かを、このすべてのコードとuse SQLiteAssetHelperを削除します。

+1

代替答え:のonCreate内で初期化された 'mCtx'を使用して削除し、他のコンテキスト –

+0

答えのこのような(そして、あなたがやっているという事実この質問をもう一度開いてください)は、役に立たない答えでいっぱいになってしまったのですが、それは将来どのような人を助けることになるのでしょうか? –

+0

@RC: 'NullPointerException'は任意の数の根本原因を持つことができます。 *即時*の原因(初期化されていない 'context'フィールドを参照)は、あなたの提案された複製にうまく収まるかもしれません。しかし、(そのような初期化の前に何かを初期化しようとする)*根本的な問題はありません。私の答えでは、私は両方の面に取り組んだので、IMHOはOPとサイト全体に価値を追加します。ライフサイクルの詳細な説明やイニシャライザがここではうまくいかない理由など、より良い回答を提供できると思われる場合は、自由に追加してください。 – CommonsWare