2016-10-04 8 views
-1

だから私は思っていたことをかなり単純で簡単にしようとしています。私は自分自身を作成し​​たアンドロイドのSqliteデータベースからいくつかのデータをロードしようとしています。唯一の問題は、このエラーが発生することです。Sqliteは既存のタイトルに「無効な列のタイトル」を投げる

W/MainActivity: onCreate started 
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
W/NotificationDbHelper: Column in cursor named: _id 
W/NotificationDbHelper: Column in cursor named: title 
W/NotificationDbHelper: Column in cursor named: additional 
W/NotificationDbHelper: Column in cursor named: icon 
W/MainActivity: onCreate ended 
D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 

       [ 10-04 09:04:07.090 4272: 4272 D/   ] 
       HostConnection::get() New Host Connection established 0xad17b6a0, tid 4272 
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
       Process: dk.simwir.lockscreennotifications, PID: 4272 
       java.lang.RuntimeException: An error occurred while executing doInBackground() 
        at android.os.AsyncTask$3.done(AsyncTask.java:309) 
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
        at java.lang.Thread.run(Thread.java:818) 
       Caused by: java.lang.IllegalArgumentException: Invalid column title 
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165) 
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 
        at android.content.ContentResolver.query(ContentResolver.java:491) 
        at android.content.CursorLoader.loadInBackground(CursorLoader.java:64) 
        at android.content.CursorLoader.loadInBackground(CursorLoader.java:56) 
        at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312) 
        at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69) 
        at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66) 
        at android.os.AsyncTask$2.call(AsyncTask.java:295) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
        at java.lang.Thread.run(Thread.java:818)  

テーブルからデータをロードしようとしているとき。主なエラーの継ぎ目は:Caused by: java.lang.IllegalArgumentException: Invalid column titleです。列が無効であると主張していますが、ログ出力に表示されているように、作成された列はそこにあるようです:W/NotificationDbHelper: Column in cursor named: title。そして、私はAndroidのADBからデータベースにアクセスしても、それが存在することを確認しました:

Table schema

問題を調査するとき私が見つけた主な「修正」は、私が投影マップに追加するために必要なことでしたしかし私はそれを試みたが、それでもそれを修正しなかった。

エラーは自分のコードで直接発生するようではありませんが、バックグラウンドスレッドで発生するので、ログ出力によってエラーを特定するのが難しくなります。しかし、データベースからの情報は、このコードでロードされます。

Cursor cursor = notificationDbHelper.getAllActiveNotifications(); 
    if(cursor == null){ 
     Log.e(TAG, "Cursor returned null"); 
     Toast toast = Toast.makeText(getApplicationContext(), R.string.cursor_null_error, Toast.LENGTH_LONG); 
     toast.show(); 
    }else if (cursor.getCount()==0){ 
     Log.e(TAG, "Cursor returned empty"); 
     Toast toast = Toast.makeText(getApplicationContext(), R.string.no_active_notifications, Toast.LENGTH_SHORT); 
     toast.show(); 
    }else{ 
     String[] fromColumns = {ActiveNotificationEntry.COLUM_NAME_TITLE, ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT}; 
     int[] toViews = {R.id.notification_title, R.id.notification_additional_text}; 

     cursorAdapter = new SimpleCursorAdapter(this, R.id.simple_notification, cursor, fromColumns, toViews, 0); 
     notificationList.setAdapter(cursorAdapter); 
    } 

データベースと対話getAllActiveNotifications機能は、次のようになります。

public Cursor getAllActiveNotifications(){ 
    HashMap<String, String> myProjectionMap = new HashMap<String, String>(); 

    myProjectionMap.put(ActiveNotificationEntry._ID, ActiveNotificationEntry._ID); 
    myProjectionMap.put(ActiveNotificationEntry.COLUM_NAME_TITLE, ActiveNotificationEntry.COLUM_NAME_TITLE); 
    myProjectionMap.put(ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT, ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT); 
    myProjectionMap.put(ActiveNotificationEntry.COLUM_NAME_ICON, ActiveNotificationEntry.COLUM_NAME_ICON); 

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(ActiveNotificationEntry.TABLE_NAME); 
    queryBuilder.setProjectionMap(myProjectionMap); 

    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = queryBuilder.query(db,CURSOR_COLUMNS, null, null, null, null, null); 

    if (cursor!=null){ 
     for(int i = 0; i < cursor.getColumnCount(); i++){ 
      Log.w("NotificationDbHelper", "Column in cursor named: " + cursor.getColumnName(i)); 
     } 
     cursor.moveToFirst(); 
     return cursor; 
    }else { 
     Log.e("NotificationDbHelper", "Cursor returned null"); 
     return null; 
    } 
} 

カーソルcolums配列は、これを含んでいます

public static final String[] CURSOR_COLUMNS = new String[]{ 
     ActiveNotificationEntry._ID, 
     ActiveNotificationEntry.COLUM_NAME_TITLE, 
     ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT, 
     ActiveNotificationEntry.COLUM_NAME_ICON}; 

表は、getActiveNotification()と同じファイル内に作成されます。このファイルには、SQLiteOpenHelperを拡張し、作成にこれを持っています

@Override 
public void onCreate(SQLiteDatabase sqLiteDatabase) { 
    sqLiteDatabase.execSQL(NotificationContract.SQL_CREATE_ENTRIES); 
} 

ここで参照SQL_CREATE_ENTRIES定数は次のとおりです。

public static final String SQL_CREATE_ENTRIES = 
     "CREATE TABLE " + ActiveNotificationEntry.TABLE_NAME + " (" + 
       ActiveNotificationEntry._ID + " INTEGER PRIMARY KEY" + COMMA_SEP + 
       ActiveNotificationEntry.COLUM_NAME_TITLE + TEXT_TYPE + COMMA_SEP + 
       ActiveNotificationEntry.COLUM_NAME_ICON + TEXT_TYPE + COMMA_SEP + 
       ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT + TEXT_TYPE + ")"; 

私が代わりにQueryBuilderの簡単なdatabase.queryを試してみましたが、同じ結果としています:エラーメッセージが、それはこの時点でアクティブ「doInBackground()」が存在すべきではない任意のasynkTasksにあったと言うにもかかわらず

Cursor cursor = db.query(ActiveNotificationEntry.TABLE_NAME, CURSOR_COLUMNS,null,null,null,null,null,null); 

gistに関連すると思われるすべてのファイルを収集しました。上記のMainActivityからの情報の使用は87行目です。

+0

を行っていますこの前にテーブル作成クエリを実行しましたか?このクエリを投稿できますか? –

答えて

0

単一のテーブルを取得する必要がある場合は、SQLiteQueryBuilderを使用することは適していません。主に結合クエリ用に作られています。

あなたがする必要がある場合は、単純なテーブルを照会する必要がある場合this link for example

を見て、参加しquery functionを使用します。

SQLiteDatabase db = this.getReadableDatabase(); 
Cursor cursor = db.query(myTable, myColumns, null, null, null, null, null); 

そして、あなたは、はいおそらく

+0

これは私がどのようにして始めたのかということでしたが、QueryBuilderはトラブルシューティングプロセスの一環として提供されました。行の前に 'Cursor cursor = db。クエリ(ActiveNotificationEntry.TABLE_NAME、CURSOR_COLUMNS、null、null、null、null、null、null); 'しかし、これに戻ると同じエラーが発生します。 – simwir

+0

@simwirこのコードはうまくいかなければならない、私はほとんどすべてのプロジェクトでそれを使用している。あなたはあなたがそれを呼び出す方法で何か間違っている。あなたの質問に "doInBackground()"に問題がありますが、非同期タスクを追加してください。 –

+0

問題は、非同期のタストで呼び出されていないことです。私はこの[要点](https://gist.github.com/simwir/33c222a1159de56a3395d46c5e7febde)に関連すると思うファイルを投稿しました。上の質問のコードスニペットは、MainActivity.javaの87行目です。 – simwir

関連する問題