2017-09-26 2 views
0

J'essaie de faire des choses très simples, mais je suis venu avec la conclusion que mon code est très moche et je suis sûr qu'il existe des moyens d'améliorer la performance du code et la clarté.Réduire et améliorer le code pour la déclaration SQL

Comment puis-je le faire uniquement avec une instruction SQL dans Android SQLITE?

J'ai deux tables: A et B. Dans A colonnes colonnes d, p, u. Et dans la table B colonnes d, p, u. Les colonnes ont les mêmes noms.

J'ai besoin de trouver la dernière ligne ajoutée dans chaque table où la colonne p est une valeur. Et les colonnes de mise à jour d et u du tableau B avec des valeurs de colonnes d et u du tableau A.

final String selection = A.p + SQL_LIKE; 
final String[] selectionArgs = new String[]{phone}; 
final String sortOrder = A.d + " DESC LIMIT 1"; 

final Cursor cursorA = getContentResolver().query(URI_A, 
       null, selection, selectionArgs, sortOrder); 

if (cursorA != null && cursorA.moveToFirst()) { 

    final long dateTimeMillis = cursorA.getLong(cursorA.getColumnIndex(A.d));    

    final String selectionB = B.p + SQL_LIKE; 
    final String[] selectionArgsB = new String[]{'%' + phone}; 
    final Cursor cursorB = getContentResolver().query(URI_A, null, 
         selectionB, selectionArgsB, A.d + " DESC LIMIT 1"); 

    if(cursorB != null && cursorB.moveToFirst()){ 

     final EntityB entityB = new EntityB().getUnitFromCursor(cursorB); 

     final ContentValues contentValues = new ContentValues(); 
     contentValues.put(B.d, dateTimeMillis); 
     contentValues.put(B.u, durationMillis); 

     final String where = B._ID + SQL_ADD_VALUE; 
        final String[] whereArgs = new String[]{entityB.getId()}; 

     getContentResolver.update(URI_B, values, where, whereArgs) 

     cursorB.close(); 
    } 

callLogCursor.close(); 
} 

Question: Comment puis-je améliorer mon code à l'avenir si je besoin de quelque chose même je ne pas besoin d'écrire tellement de passe-partout et il semble plus propre. Je suis sûr que ce code peut être changé sur une seule instruction SQL - je pense que c'est la meilleure solution pour un tel problème.

+0

Souhaitez-vous étiqueter toute autre langue autre que SQLite? – Yunnosch

+0

Veuillez créer un [mcve], composé de quelques lignes de "create ..." et plusieurs lignes de "insert ...". l'outil de ligne de commande SQLite a la fonction '.dump' pour le faire commodément. Ajoutez la sortie désirée pour l'exemple de contenu de votre mcve. – Yunnosch

+0

Si votre code fait essentiellement ce que vous voulez, alors la question nécessite une description spécifique du problème. Sinon, il est soit hors sujet pour être trop large ou pour appartenir à un site différent, c'est-à-dire https://codereview.stackexchange.com/ – Yunnosch

Répondre

0
UPDATE B 
SET d = (SELECT d 
     FROM A 
     WHERE p LIKE ... 
     ORDER BY d DESC 
     LIMIT 1), 
    u = (SELECT u 
     FROM A 
     WHERE p LIKE ... 
     ORDER BY d DESC 
     LIMIT 1) 
WHERE ID = (SELECT ID 
      FROM B 
      WHERE p LIKE ... 
      ORDER BY d DESC 
      LIMIT 1); 

S'il est possible que A n'a pas de lignes pour un p spécifique B, vous devez ajouter un autre filtre à l'extérieur de l'alinéa (EXISTS (SELECT * FROM A WHERE ...)).