2016-10-21 9 views
0

アップグレードする前にデータベースのテーブルをチェックする必要があります。AndroidデータベースのrawQuery:奇妙なカーソルの振る舞い

データベースのバージョンが増加すると、私自身のDatabaseHelperでSQLiteOpenHelper.onUpgrade(SQLiteDatabase db, int oldVer, int newVer)が上書きされます。

私はテーブル名を取得するためにsqlite_masterテーブルの上に、このクエリを使用

:同じクエリが私のAPPのothesの場所で素晴らしい作品

(DBが空でなく、29個のオブジェクトを含む)select * from sqlite_masterをしかし、カーソルもcursor.getCount()==29場合は、空のようです。私のアプリが

minSdkVersion 12 
targetSdkVersion 24 

この奇妙な振る舞いについての任意のアイデアを使用して構築されている間

私は、エミュレートのAndroid 4.4(API 19)でこれをテストしていますか?ここで

コードです:

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のクエリが機能しました!

build.gradleのbuildToolsVersionが、アプリケーションモジュールとライブラリモジュールの24.0.2から24.0.3にアップグレードされました。その後、完全な再構築。

私は理由を知りませんが...今質問はメインモジュールまたはライブラリモジュールのいずれかで機能します。