2017-09-26 6 views
0

私は非常に単純なものを作ろうとしていますが、私のコードは非常に醜いとの結論に達し、コードのパフォーマンスとクリアを改善するいくつかの方法があると確信しています。SQL文のコードを最小限にして改善する

私はAndroidのSQLiteのSQL文でのみそれを行うことができますか?

私は2つのテーブルAとBを持っています。 Inテーブルd、p、uの列。そしてテーブルBの列d、p、u。列の名前は同じです。

カラムpが値である各テーブルで最後に追加された行を見つける必要があります。そして、更新さd列の値を持つテーブルBからDとU列とuのテーブル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(); 
} 

質問:私は同じものを必要な場合はどのように私は将来的に自分のコードを向上させることができ、私は書く必要はありませんそんなに多くの定型文句はもっときれいに見えます。私はこのコードが単一のSQL文で変更できると確信しています - これはこのような問題のための最良の解決策だと思います。

+0

他にもSQLite以外のタグを付けたいですか? – Yunnosch

+0

いくつかの "create ..."行と "insert ..."という行からなる[mcve]を作成してください。 SQLiteのコマンドラインツールには便宜的にそうするための '.dump'機能があります。あなたのmcveのサンプルコンテンツに必要な出力を追加します。 – Yunnosch

+0

あなたのコードが基本的にあなたが望むことをしているなら、問題は特定の問題の説明を必要とします。それ以外の場合は、広すぎるか、別のサイトの所属(https://codereview.stackexchange.com/)の話題になります。 – Yunnosch

答えて

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); 

それはABに特定pの行を持っていない可能性がある場合、あなたは外に別のフィルタを追加する必要がありますWHERE句(EXISTS (SELECT * FROM A WHERE ...))。