2016-10-21 5 views
0

Мне нужно проверить таблицы в моей базе данных перед обновлением.База данных Android rawQuery: странное поведение курсора

I overrode SQLiteOpenHelper.onUpgrade(SQLiteDatabase db, int oldVer, int newVer) в моей собственной базе данныхHelper для выполнения работы при расширении версии базы данных.

Я использую этот запрос на sqlite_master таблицы, чтобы получить имена таблиц: select * from sqlite_master но курсор кажется пустым, даже если cursor.getCount()==29 (DB не пусто и содержит 29 объектов)

Тот же самый запрос большой в othes местах моей работы приложения ,

Я проверяю это на эмулированном Android 4.4 (API 19) в то время как мое приложение построено с

minSdkVersion 12 
targetSdkVersion 24 

Любой идеей об этом странном поведении?

Вот код:

public class DatabaseHelper extends SQLiteOpenHelper { 

    public static DatabaseHelper getHelper(Context context) { 
     if (instance == null) 
      synchronized(DatabaseHelper.class) { 
       if(instance==null) 
        instance = new DatabaseHelper(context.getApplicationContext()); 
      } 

     return instance; 
    } 

    private DatabaseHelper(Context c) { 
     super(c, DB_NAME, null, 6 /* version */); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     final boolean inTransaction = db.inTransaction(); 

     if(!inTransaction) 
      db.beginTransaction(); 

     Cursor cur = null; 

     try { 
//   cur = db.query("sqlite_master", null, null, null, null, null, null); // SAME BEHAVIOUR 
      cur = db.rawQuery("select * from sqlite_master", null); 

      int count = cur.getCount(); // ASSIGN 29 TO COUNT 
      while(cur.moveToNext()) { 
       ** NEVER ENTERS HERE ** 
      } 

      if(!inTransaction) 
       db.setTransactionSuccessful(); 

     } catch (Exception e) { 
      log.e(DBTAG, e.getMessage(), e); 
     } finally { 
      if(cur!=null) 
       cur.close(); 

      if(!inTransaction) 
       db.endTransaction(); 
     } 
    } 
} 
+0

Я думаю, вы должны использовать cursor.moveToFirst(); сначала –

ответ

0

Я просто реконструировал свое дело, и нашел «SQLite» зарезервирована для внутреннего использования, следующее сообщение об ошибке, я получил.

android.database.sqlite.SQLiteException: имя объекта зарезервирован для внутреннего использования: sqlite_master

Может быть, вы можете попробовать другое имя таблицы и посмотреть, он может работать или нет.

+0

Я использовал запрос sqlite_master, и у меня никогда не было «android.database.sqlite.SQLiteException: имя объекта, зарезервированное для внутреннего использования: sqlite_master». Я пытаюсь переместить запрос в другом месте и работает! –

+1

Это сообщение об ошибке может произойти только при создании нового объекта, а не с помощью SELECT. –

0

Код, который я разместил, был в библиотечном модуле. Когда я переместил его в основной модуль приложения, запрос на sqlite_master работал!

Я обновил buildToolsVersion в build.gradle с 24.0.2 до 24.0.3 в модуле приложения и библиотечном модуле. Затем полная перестройка.

Я не знаю, почему, но ... теперь запрос работает либо в основном модуле, либо в библиотечном модуле!