IllegalArgumentException: de colonne non Valide
Voici le logcat:
01-15 16:06:03.622: ERROR/AndroidRuntime(22300): Uncaught handler: thread main exiting due to uncaught exception
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mohit.geo2do/com.mohit.geo2do.activities.TaskEdit}: java.lang.IllegalArgumentException: Invalid column due_date
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.os.Handler.dispatchMessage(Handler.java:99)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.os.Looper.loop(Looper.java:123)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.app.ActivityThread.main(ActivityThread.java:4363)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at java.lang.reflect.Method.invokeNative(Native Method)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at java.lang.reflect.Method.invoke(Method.java:521)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at dalvik.system.NativeStart.main(Native Method)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): Caused by: java.lang.IllegalArgumentException: Invalid column due_date
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.database.sqlite.SQLiteQueryBuilder.computeProjection(SQLiteQueryBuilder.java:508)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.database.sqlite.SQLiteQueryBuilder.buildQuery(SQLiteQueryBuilder.java:356)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:309)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:266)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at com.mohit.geo2do.provider.TasksProvider.query(TasksProvider.java:174)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.content.ContentProvider$Transport.query(ContentProvider.java:130)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.content.ContentResolver.query(ContentResolver.java:202)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at com.mohit.geo2do.activities.TaskEdit.onCreate(TaskEdit.java:105)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-15 16:06:03.657: ERROR/AndroidRuntime(22300): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
La ligne qui lui est associée est:
private Cursor task;
private Uri uri;
private String[] PROJECTION {
Tasks._ID, Tasks.TITLE, Tasks.COMPLETED, Tasks.DUE_DATE, Tasks.IMPORTANCE, Tasks.NOTES
};
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_task);
...
uri = getIntent().getData();
task = getContentResolver().query(uri, PROJECTION, null, null, null);
}
...
Quel pourrait être le problème? La base de données est créée à l'amende juste. Est-il un autre code que vous auriez besoin de voir?
Mise à JOUR:
Je suis TRÈS sûr que cette colonne existe. J'ai interrogé la base de données avec ceci:
Cursor c = db.rawQuery("SELECT * FROM tasks LIMIT 1", null);
for (int i = 0; i < c.getColumnNames().length; i++) {
Log.v(TAG, c.getColumnNames()[i]);
}
Et dans le LogCat:
01-15 16:52:07.857: VERBOSE/TasksProvider(24325): Creating database...
01-15 16:52:07.862: VERBOSE/TasksProvider(24325): _id
01-15 16:52:07.862: VERBOSE/TasksProvider(24325): title
01-15 16:52:07.862: VERBOSE/TasksProvider(24325): completed
01-15 16:52:07.862: VERBOSE/TasksProvider(24325): due_date
01-15 16:52:07.862: VERBOSE/TasksProvider(24325): notes
01-15 16:52:07.862: VERBOSE/TasksProvider(24325): importance
De sorte que la colonne N'existe pas.
Qui est en ligne:105? task = getContentResolver().query(uri, PROJECTION, null, null, null);
Oui. Vous êtes correct.
Sur - 'colonne non Valide due_date'. Êtes-vous sûr à 100% qu'il y a une colonne de ce type?
Vérifier la mise à jour. Je suis très sûr et j'ai LogCat la preuve que 'due_date' N'existe pas.
Pourquoi les trois dernières valeurs dans la projection défini par 'que'? Peut-être parce que ces valeurs sont des entiers/longs?
Oui. Vous êtes correct.
Sur - 'colonne non Valide due_date'. Êtes-vous sûr à 100% qu'il y a une colonne de ce type?
Vérifier la mise à jour. Je suis très sûr et j'ai LogCat la preuve que 'due_date' N'existe pas.
Pourquoi les trois dernières valeurs dans la projection défini par 'que'? Peut-être parce que ces valeurs sont des entiers/longs?
OriginalL'auteur Mohit Deshpande | 2011-01-15
Vous devez vous connecter pour publier un commentaire.
La colonne sans doute n'existe pas dans votre base de données, mais si vous n'avez pas ajouté à la colonne d'un truc qui s'appelle la carte de projection, vous obtiendrez la "colonne non valide" erreur, vous voyez. Vous pouvez ajouter la carte de projection par l'intermédiaire d'un générateur de requêtes objet, comme ceci:
À comprendre ce qui se passe, regarder dans la source de la SQLiteQueryBuilder classe, et vous verrez suivantes:
En gros, c'est de vérifier les colonnes que vous avez demandé dans votre projection par rapport à une liste de "permis" de colonnes, et vous pouvez voir que si la carte ne contient pas la colonne de votre projection, il va lever une IllegalArgumentException, juste comme vous l'avez vu. (J'imagine que cette vérification contre la carte est une fonctionnalité de sécurité pour empêcher SQL attaques de personnes abusant de votre fournisseur de contenu, mais c'est juste une supposition.)
Notez également que si vous réglez "stricte" des cartes de projection dans votre générateur de requêtes:
Alors dans ce cas il attend de vous que vous savez exactement noms de colonne... Si vous n'en avez pas, il vérifie l' "COMME" alias de colonne -- je pense que explique le "bizarre fix" vous avez découvert.
Espère que cette aide.
OriginalL'auteur DMH
J'ai trouvé un drôle de correctif à ce. Dans
String[] PROJECTION
. Que vous avez à faire:OriginalL'auteur Mohit Deshpande
Avez-vous ajouter cette colonne dans le fournisseur de contenu de la carte en projection, par rapport à la table avec cette colonne? J'espère que cette aide.
OriginalL'auteur Paco