2

這是套的方法,我在數據庫處理器類從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) 

爲什麼會發生?

回答

3
public void saveContacts(List<Category> contacts) throws SQLException 
{ 

    OrmLiteSqliteOpenHelper dbHelper= DatabaseHandler.getInstance(_context); 
    String res = Boolean.toString(dbHelper.isOpen()); 
    Log.i(" 123 ",res); 
    dbHelper= this.getWritableDatabase(); <----- here change will may help you 
    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); 
    } 
    } 
+0

但dbHelper是OrmLiteSqliteOpenHelper類的一個實例。使用this.getWritableDatabase()將其轉換爲SQLitedatabase類。它導致類型轉換... – 2012-08-03 14:29:58

+0

比你應該把你的活動的上下文傳遞給OrmLiteSqliteOpenHelper – 2012-08-03 15:27:35

+0

非常感謝你!!!你的回答讓我找到解決方案。問題是在錯誤的上下文對象! – 2012-08-06 11:36:43

1

問題通過將我的活動的上下文傳遞給OrmLiteSqliteOpenHelper解決。 我用這樣的類來維持通過應用程序生命週期對數據庫的訪問:

public class ApplicationMemory extends Application{ 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     HelperFactory.SetHelper(getApplicationContext()); 
    } 
    @Override 
    public void onTerminate() { 
     HelperFactory.ReleaseHelper(); 
     super.onTerminate(); 
    } 
} 

public class HelperFactory { 
private static DatabaseHandler databaseHelper; 

    public static DatabaseHandler GetHelper(){ 
     return databaseHelper; 
    } 

public static void SetHelper(Context context){ 
     databaseHelper = OpenHelperManager.getHelper(context,DatabaseHandler.class); 
    } 

public static void ReleaseHelper(){ 
     OpenHelperManager.releaseHelper(); 
     databaseHelper = null; 
    } 
    } 

如果數據庫處理器 - 類,這是從OrmLiteSqliteOpenHelper延伸並在我的問題描述。

非常感謝Hardik Nadiyapara。他幫了很多忙。