1

私は数日間この問題を抱えており、実際にはコードの問題を見ることはできません。Android:getWriteableDatabase()エラー

新しいデータベースマネージャオブジェクトを作成して、マネージャデータベースを開くだけで、アプリケーションを起動します。

DBManager db_manager = new DBManager(this); 
db_manager.open() 

アプリケーションは、単純な挿入トランザクションを実行する必要がありますが、エラーがスローされます。

02-11 18:13:30.350: E/AndroidRuntime(8961): Caused by: java.lang.NullPointerException 
02-11 18:13:30.350: E/AndroidRuntime(8961):  at com.test.DB.DBManager$DatabaseHelper.onCreate(DBManager.java:44) 
02-11 18:13:30.350: E/AndroidRuntime(8961):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:106) 
02-11 18:13:30.350: E/AndroidRuntime(8961):  at com.test.DB.DBManager.open(DBManager.java:61) 
02-11 18:13:30.350: E/AndroidRuntime(8961):  at com.test.DB.Display.onCreate(Display.java:26) 
02-11 18:13:30.350: E/AndroidRuntime(8961):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
02-11 18:13:30.350: E/AndroidRuntime(8961):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 

DatabaseHelperクラス:

class DatabaseHelper extends SQLiteOpenHelper{ 

    DatabaseHelper(Context context){ 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db){    
      the_db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     } 
} 

DBManagerの方法、オープン()の原因となっています問題。

public DBManager(Context c){ 
    this.context = c; 
    helper = new DatabaseHelper(context); 
} 


// Makes the_db available to the Manager class. 
public DBManager open() throws SQLException{ 
    the_db = helper.getWritableDatabase(); 
    return this; 
} 

答えて

1

試してみてください。

@Override 
    public void onCreate(SQLiteDatabase db){    
      db.execSQL(DATABASE_CREATE); 
    } 

あなたはすでにあなたのonCreate()方法でデータベースを取得し、SQLiteDatabaseパラメータデシベルであり、あなたがそれを使用する必要があります。

EDIT: あなたはDBManagerのフィールドであるthe_dbexecuteSQL()を呼び出すので、NullPointerExceptionを取得し、おそらくのように宣言:あなたが実際に取得するときに

SQLiteDatabase the_db; 

または

SQliteDatabase the_db = null; 

onCreate(SQLiteDatabase db)の場合はnullにexecuteSQL()を呼び出します。 DBManagerのコードは、次のようになります。

public class DBManager { 

    //the actual database you will use to insert,select etc after the getWritableDatabase() call 
    private SQLiteDatabase the_db; 
    private Context context; 
    private DatabaseHelper helper; 

    public DBManager(Context c) { 
     this.context = c; 
     helper = new DatabaseHelper(context); 
    } 

    // Makes the_db available to the Manager class. 
    public DBManager open() throws SQLException { 
     the_db = helper.getWritableDatabase(); 
     return this; 
    } 

    class DatabaseHelper extends SQLiteOpenHelper { 

     DatabaseHelper(Context context) { 
      super(context, "something.db", null, 1); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // the db is the SQLiteDatabase that android will offer you 
      // and you must use it! 
      db.execSQL("CREATE TABLE nametables(name TEXT);"); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     } 
    } 

} 
+0

onCreate()はオーバーライドできません。 – MindDrip

+0

@MindDripおそらく私の答えは混乱していました。私は 'public void onCreate(SQLiteDatabase db){ the_db.execSQL(DATABASE_CREATE);を参照しています。 } 'あなたの' DatabaseHelper'(SQLiteOpenHelperを継承しています)からオーバーライドできるメソッド - > http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html – Luksprog

+0

hmm strange、eclipseが私に与える「この場所に対してオーバーライドが許可されていません」というエラーが表示されます。 – MindDrip