2017-09-11 11 views
1

私のAndroidアプリの1つで、に更新されて以来、問題を起こしているSQLiteクエリを使用しています。AndroidスタジオでエラーとしてマークされたAndroid SQLiteクエリ

アプリをコンパイルして実行することはできますが、エラーとしてマークされています。

これらはクエリです。

db.execSQL("INSERT INTO table1 (…) ... substr(replace(table2.field2, ',', ''), table1.field1, 1) … FROM table1 … WHERE …"); 

は '置き換え' でエラーを与える:

')' または式が期待される、

'を置き換える' しまった私はreplaceStringを返すため、これは働くだろうと思います。

そして:

db.execSQL("DELETE FROM table1 WHERE table1.rowid IN (…)"); 

は 'ROWID' にエラーを与える:

列名または予想されるテーブル名を、得たが

'をROWIDの' 私はこれがためにあまりにも仕事だと思いますSQLiteは暗黙的にrowidを各テーブルに追加します。

そして:

db.execSQL("ATTACH DATABASE ? as newDB", new String[] { getDatabasePath(DATABASE_NAME_NEW).getPath() }); 

は、エラーを与える '?':期待

表現、得ました '?'

私はこれまで、このクエリを変更しました:

また
db.execSQL("ATTACH DATABASE '"+getDatabasePath(DATABASE_NAME_NEW).getPath()+"' as newDB"); 

db.execSQL("UPDATE table1 SET field1=0 WHERE field2 IN 
(SELECT field2 FROM table2 WHERE field3 LIKE '%blablabla%' OR field4 LIKE '%blebleble%' OR (field5 LIKE '%bliblibli%' AND field6 NOT LIKE '%blobloblo%') 
COLLATE NOCASE)"); 

これらのエラーを与える: 'field6、NOT LIKE' は、

')'または '。' 、

INまたはセミコロン、BETWEEN期待

私はと間違っているかわからない ')' だ:予想では、

'NOCASE)' 'NOT' ですこれです。

これらのクエリは正しいですか? iOSでは同一であり、うまく機能しています。

UPDATE:

これらは、完全なクエリ(残念ながら原因私のクライアントのセキュリティポリシーに私はテーブルとフィールドの名前を変更する必要がありますが、私はエラーを検出しても大丈夫であると思います)です。

db.execSQL("INSERT INTO table1 (field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14) " + 
        "SELECT t6.field1, t7.field2, t3.field4, t3.field5, CASE WHEN t5.field1='1' THEN '11' " + 
        "WHEN t5.field1='2' THEN '22' WHEN t5.field1='3' THEN '33' WHEN t5.field1='4' THEN '44' " + 
        "ELSE t5.field1 END AS newfield1, t4.field1, CASE WHEN t2.field1 = '0' THEN t4.field2 " + 
        "ELSE substr(replace(t4.field3, ',', ''), t2.field1, 1) END AS newfield2, t2.field4, '0', -1, '0', '1', -1, t8.field1 " + 
        "FROM table2 AS t2, table3 AS t3, table4 AS t4, table5 AS t5, table6 AS t6, table7 AS t7, table8 AS t8 " + 
        "WHERE t2.field2=t3.field3 AND t2.field3=t4.field1 AND t2.field3=t5.field2 AND t3.field2=t7.field2 AND " + 
        "t3.field1=t6.field1 AND substr(t5.field1, 1, 1) IN ('1', '2', '3', '4') AND substr(t5.field1, 2, 1) IN ('1', '2', '3', '4') AND t2.field5=t8.field2"); 

db.execSQL("DELETE FROM table1 WHERE table1.rowid IN (SELECT table1.rowid FROM table1, table4 AS t4 WHERE table1.field6=t4.field1 AND (((t4.field2 NOT LIKE '%%' || substr(table1.field5, 1,1) || '%%') AND (t4.field3 NOT LIKE '%%' || substr(table1.field5, 1,1) || '%%')) OR ((t4.field2 NOT LIKE '%%' || substr(table1.field5, 2,1) || '%%') AND (t4.field3 NOT LIKE '%%' || substr(table1.field5, 2,1) || '%%'))))"); 

db.execSQL("ATTACH DATABASE ? as newDB", new String[] { getDatabasePath(DATABASE_NAME_NEW).getPath() }); 
Changed to: 
db.execSQL("ATTACH DATABASE '"+getDatabasePath(DATABASE_NAME_NEW).getPath()+"' as newDB"); 
And the error is gone. 

db.execSQL("UPDATE table1 SET field13=1 WHERE field2 IN (SELECT t7.field2 FROM table7 AS t7 WHERE t7.field1='Text1' OR t7.field1='Text2' OR t7.field1 LIKE '%TEXT3%' OR t7.field1 LIKE '%TEXT4%' OR t7.field1 LIKE '%TEXT5%' OR t7.field1 LIKE '%TEXT6%' OR (t7.field1 LIKE '%TEXT7%' AND t7.field1 NOT LIKE '%TEXT8%') COLLATE NOCASE)"); 
+0

読んヒントで更新またはDBHelperに挿入するために? –

+0

どのAndroidバージョンを設定しましたか? –

+0

私はAndroid 23(6.0)を設定しました。完全なクエリに関しては、私はそれらを投稿しようとします。 – Wonton

答えて

0

ここ@Wontonは、あなたが得るの束を持っているし、データベーステーブル内の各項目に設定されたデータベースモデルを持っているところ、これはある提案を使用MVPデザインです。 次は、DBHelperというアクティビティですべてのCRUDを処理し、エラーの可能性の少ない他のアクティビティから呼び出すことができます。 YES私はdb.execSQLを使用していますが、文字列を持っていたら、人生はここで良いですDBHelper活動からのコードの例は、あなたが完全なクエリを投稿することができMVP

/* Update Record in Database*/ 
public void updateDBRow(String rowid,String website, String username, String password, String question,String answer, String notes){ 

    db = this.getWritableDatabase(); 
    ContentValues cv = new ContentValues(); 

    cv.put(Col_WS,website); 
    cv.put(Col_UN,username); 
    cv.put(Col_PW,password); 
    cv.put(Col_SQ,question); 
    cv.put(Col_SA,answer); 
    cv.put(Col_NOTES,notes); 

    /*NOTE WHERE THE quotation MARKS ARE */ 
    db.update(TABLE_INFO,cv, Col_ID + " = ?",new String[] { rowid }); 
    db.close(); 
} 
関連する問題