1

У меня была эта проблема в течение нескольких дней, и на самом деле я не вижу проблемы в коде, поэтому некоторые дополнительные глаза, чтобы посмотреть, действительно оценены.Android: getWriteableDatabase() error

Я запускаю приложение, просто создавая новый объект менеджера баз данных и открывая базу данных менеджеров.

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

Try:

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

Вы уже получаете базу данных в методе onCreate(), является параметром SQLiteDatabase дБ и вы должны использовать его.

EDIT: Вы получаете NullPointerException потому, что вы называете executeSQL() на the_db, который является полем в DBManager, вероятно, объявлен как:

SQLiteDatabase the_db; 

или

SQliteDatabase the_db = null; 

поэтому, когда вы на самом деле получить в поле onCreate(SQLiteDatabase db) вы вызываете executeSQL() на null. Код для 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 странно, eclipse дает мне ошибка «Переопределение запрещена для этого местоположения». – MindDrip