這是套的方法,我在數據庫處理器類從OrmLiteSqliteOpenHelper擴展使用:SQLiteOpenHelper.getWritableDatabase()拋出NullPointerException異常ORMLite
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource)
{
try
{
TableUtils.createTable(connectionSource, Category.class);
TableUtils.createTable(connectionSource, Level.class);
DataParsing a = new DataParsing();
a.wrapCategories();
Log.i(DatabaseHandler.class.getName(), "created new entries in onCreate: ");
}
catch (SQLException e){
Log.e(TAG, "error creating DB " + DATABASE_NAME);
throw new RuntimeException(e);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVer, int newVer)
{
try
{
TableUtils.dropTable(connectionSource, Category.class, true);
TableUtils.dropTable(connectionSource, Level.class, true);
onCreate(db, connectionSource);
}
catch (SQLException e){
Log.e(TAG,"error upgrading db "+DATABASE_NAME+"from ver "+oldVer);
throw new RuntimeException(e);
}
}
public Dao<Category, Integer> getCategoryDao() throws SQLException
{
if (simpleCategoryDao == null) {
simpleCategoryDao = getDao(Category.class);
}
return simpleCategoryDao;
}
public Dao<Level, Integer> getLevelDao() throws SQLException
{
if (simpleLevelDao == null) {
simpleLevelDao = getDao(Level.class);
}
return simpleLevelDao;
}
當我運行我的應用程序,我得到這樣的消息
08-03 16:44:08.619: V/droidDatabaseConnection(12196): [email protected]: compiled statement got [email protected]: CREATE TABLE `categories` (`title` VARCHAR , `id` INTEGER , PRIMARY KEY (`id`))
08-03 16:44:08.619: V/ndroidCompiledStatement(12196): compiled statement runExecute changed 1 rows: CREATE TABLE `categories` (`title` VARCHAR , `id` INTEGER , PRIMARY KEY (`id`))
08-03 16:44:08.629: V/droidDatabaseConnection(12196): [email protected]: compiled statement got [email protected]: CREATE TABLE `levels` (`title` VARCHAR , `id` INTEGER , PRIMARY KEY (`id`))
08-03 16:44:08.629: V/ndroidCompiledStatement(12196): compiled statement runExecute changed 1 rows: CREATE TABLE `levels` (`title` VARCHAR , `id` INTEGER , PRIMARY KEY (`id`))
據我瞭解,數據庫已成功創建。然後,我想要把對象的名單與方法有:
public void saveContacts(List<Category> contacts) throws SQLException
{
OrmLiteSqliteOpenHelper dbHelper= DatabaseHandler.getInstance(_context);
String res = Boolean.toString(dbHelper.isOpen());
Log.i(" 123 ",res);
dbHelper.getWritableDatabase();
Dao<Category, Integer> daoContact=dbHelper.getDao(Category.class);
QueryBuilder<Category, Integer> queryBuilder = daoContact.queryBuilder();
daoContact.queryRaw("insert into categories values (hello, 1)");
Log.i("dao",queryBuilder.selectColumns("title").prepare().toString());
for (Category contact : contacts) {
Log.i("dao",contact.toString());
HelperFactory.GetHelper().getCategoryDao().createIfNotExists(contact);
}
}
而且在行dbHelper.getWritableDatabase();我得到
08-03 16:44:29.199: E/AndroidRuntime(12196): FATAL EXCEPTION: main
08-03 16:44:29.199: E/AndroidRuntime(12196): java.lang.NullPointerException
08-03 16:44:29.199: E/AndroidRuntime(12196): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
08-03 16:44:29.199: E/AndroidRuntime(12196): at com.assignmentexpert.LoginActivity.saveContacts(LoginActivity.java:268)
08-03 16:44:29.199: E/AndroidRuntime(12196): at com.assignmentexpert.LoginActivity$4.onClick(LoginActivity.java:132)
08-03 16:44:29.199: E/AndroidRuntime(12196): at android.view.View.performClick(View.java:2485)
08-03 16:44:29.199: E/AndroidRuntime(12196): at android.view.View$PerformClick.run(View.java:9080)
08-03 16:44:29.199: E/AndroidRuntime(12196): at android.os.Handler.handleCallback(Handler.java:587)
08-03 16:44:29.199: E/AndroidRuntime(12196): at android.os.Handler.dispatchMessage(Handler.java:92)
08-03 16:44:29.199: E/AndroidRuntime(12196): at android.os.Looper.loop(Looper.java:123)
08-03 16:44:29.199: E/AndroidRuntime(12196): at android.app.ActivityThread.main(ActivityThread.java:3687)
08-03 16:44:29.199: E/AndroidRuntime(12196): at java.lang.reflect.Method.invokeNative(Native Method)
08-03 16:44:29.199: E/AndroidRuntime(12196): at java.lang.reflect.Method.invoke(Method.java:507)
08-03 16:44:29.199: E/AndroidRuntime(12196): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
08-03 16:44:29.199: E/AndroidRuntime(12196): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
08-03 16:44:29.199: E/AndroidRuntime(12196): at dalvik.system.NativeStart.main(Native Method)
爲什麼會發生?
但dbHelper是OrmLiteSqliteOpenHelper類的一個實例。使用this.getWritableDatabase()將其轉換爲SQLitedatabase類。它導致類型轉換... – 2012-08-03 14:29:58
比你應該把你的活動的上下文傳遞給OrmLiteSqliteOpenHelper – 2012-08-03 15:27:35
非常感謝你!!!你的回答讓我找到解決方案。問題是在錯誤的上下文對象! – 2012-08-06 11:36:43