2010-09-29 30 views
0

Récemment, j'ai mis à jour mon Nexus One vers Froyo (2.2) et j'ai remarqué un comportement significativement différent avec SQLite. Par exemple, j'utilisais une sous-requête (renvoyant des données de chaîne) dans le cadre d'une clause IN, et la partie de sous-requête ne semble plus fonctionner correctement. Je joins un exemple de requête SQL travaillant avec la base de données de contacts ci-dessous (requête directe indiqué à titre d'illustration):Android 2.2 (Froyo) SQLite manque certaines fonctionnalités de la clause IN?

SELECT _id FROM data WHERE display_name IN (SELECT display_name FROM contacts); 

Jusqu'à Android 2.1 ce n'était pas un problème. Cependant, après la mise à jour, cela retourne un jeu d'enregistrements vide sauf si j'exécute la sous-requête séparément, entourez chacune des valeurs résultantes dans des guillemets simples et ajoutez ces valeurs directement dans la clause IN.

J'ai remarqué cette perte de fonctionnalité dans plusieurs applications sur lesquelles je travaille, mais je dois noter que cela semble fonctionner lorsque les résultats seraient numériques plutôt que basés sur des chaînes.

Est-ce que quelqu'un d'autre a rencontré ce problème?

Répondre

0

Si le comportement de SQLite a en effet changé, vous pouvez essayer de réécrire la requête en utilisant l'opérateur EXISTS place:

SELECT _id FROM data WHERE EXISTS 
    (SELECT * FROM contacts WHERE contacts.display_name = data.display_name) 

Cela supprime la dépendance de l'opérateur IN.

+0

Grâce à ce coup de œil utile! Malheureusement, je vais devoir changer la sous-requête aussi puisque le code de fusion d'android a changé comment display_name est généré. Cela devrait être un coup de pouce pour mes autres projets si :) –