SQLiteOpenHelper.getWritableDatabase() throws NullPointerException ORMLite

596 views
Skip to first unread message

Иван Дунский

unread,
Aug 3, 2012, 9:55:27 AM8/3/12
to ormlite...@googlegroups.com

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?

Nicholas Campion

unread,
Aug 3, 2012, 10:07:08 AM8/3/12
to ormlite...@googlegroups.com
Can you remove the line dbHelper.getWritableDatabase(); ... it shouldn't be necessary since getDao should handle making sure the database is available. I don't know why it would cause a problem but I also don't see why its necessary in the code you've given us since you don't use the result.

Nick
Reply all
Reply to author
Forward
0 new messages