Android: ошибка getWriteableDatabase () - PullRequest
1 голос
/ 11 февраля 2012

У меня возникла эта проблема в течение нескольких дней, и я действительно не вижу проблемы в коде, поэтому несколько дополнительных глаз, чтобы взглянуть, действительно приветствуются.

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

 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 open () вызывают проблему.

    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 Ответ

1 голос
/ 11 февраля 2012

Попробуйте:

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

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

РЕДАКТИРОВАТЬ: Вы получаете NullPointerException, потому что вы звоните executeSQL() на the_db, который является полем в DBManager, вероятно, объявлен как:

SQLiteDatabase the_db;

или

SQliteDatabase the_db = null;

, поэтому, когда вы на самом деле получаете onCreate(SQLiteDatabase db), вы звоните 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) {
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...