Question

This is sets of methods which I use in DatabaseHandler class which extends from OrmLiteSqliteOpenHelper:

@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;
        }

When I run my app I get such messages

08-03 16:44:08.619: V/droidDatabaseConnection(12196): AndroidDatabaseConnection@405182b0: compiled statement got AndroidCompiledStatement@40578b10: 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): AndroidDatabaseConnection@405182b0: compiled statement got AndroidCompiledStatement@405f0f50: 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`) ) 

As I understand data base was created successfully. Then I want to put a List of objects there with the method:

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);
        }
      }

And on row dbHelper.getWritableDatabase(); I get

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)

Why does it happen?

Was it helpful?

Solution

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);
    }
  }

OTHER TIPS

Problem solved with passing the context of my activity to OrmLiteSqliteOpenHelper. I used such classes to maintain access to the database through the application life cycle:

public class ApplicationMemory extends Application{

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

and

 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;
   }
   }

Where DatabaseHandler - class, which is extending from OrmLiteSqliteOpenHelper and describes in my question.

Very big thanks to Hardik Nadiyapara. He helps a lot.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top