Hamquery ve execSQL kullanımı arasındaki tam fark nedir? Android etkinliğinde bir sorgu yazarken, rawquery ne zaman kullanılır ve execSQL ne zaman kullanılır? API belgelerinefark
Q
fark
36
A
cevap
68
:
bir SEÇ veya veri döndürür herhangi başka bir SQL deyimi DEĞİLDİR tek bir SQL ifadesini yürütün.
void execSQL (String sql, Object[] bindArgs)
/SİL. Belgeler tutarsızdır, ancak ikisi de aynı şekilde davranırlar.bir SEÇ/INSERT/UPDATE DEĞİLDİR tek bir SQL ifadesini yürütün
İkincisinin belgeleri daha derindir.
Cursor rawQuery (String sql, String[] selectionArgs)
sağlanan SQL çalıştırır ve sonuç kümesi üzerinden bir İmleç döndürür.
- Bir
SELECT
ifadesiyle veritabanını sorgulamak istiyorum:
rawQuery
vardır için kullanır.
=>rawQuery("SELECT ...
, Cursor
'da bir dizi satır ve sütun döndürür.
- Sadece 1x1 sorgu sonucu
SELECT count(*) FROM table
dan gibi olduğu durumlardaDatabaseUtils.longForQuery(SQLiteDatabase, String, String[])
veyaDatabaseUtils.stringForQuery(...)
kullanmak daha verimlidir (ayrıca kendi özel yöntem var olan:DatabaseUtils.queryNumEntries(...)
) - Bu & orada beri kod basitleştirenCursor
nesnenin oluşturulmasını atlar Ayrıca sıralar halinde verileri döndürür
PRAGMA table_info
gibi vb kapatmak için hiçbir şey, moveToNext olduğuINSERT
, UPDATE
veya DELETE
ya da veritabanını değiştiren başka herhangi bir şey için rawQuery
kullanın. "Why does a delete rawQuery need a moveToFirst in order to actually delete the rows?"'a girersiniz. Bu sorgulama nedeni, SQLite gecikmesi execution of the statement için anlamına gelen (imlecin erişilmesi) gerekene kadar sonucun okunmasını erteleyebilir.execSQL
vardır için kullanır:
- Sen veritabanı için "talimatlarını" var.
CREATE TABLE
(veya diğer herhangi birCREATE
bildirimi, ör.Onları dönen yerine özellikleri ayarlamakCREATE INDEX
),DROP
,PRAGMA
s ... INSERT
,UPDATE
veyaDELETE
değiştirilmiş satırı sayısına veya son ekin satır kimliği ilgilenmiyoruz.DatabaseUtils.longForQuery
SELECT last_insert_rowid()
veyaSELECT changes()
biriyle:- Eğer
update()
,insert()
,delete()
yöntemleri kullanmak ya da o okumak için ikinci bir deyimi kullanın, ya bu ihtiyaç . Her ikisi de sadece 1 tam sayı değeri döndürür. (bkz. "Get updated rows count from SQLite in Android using a raw query?" ve “SELECT last_insert_rowid()” returns always “0”)
- Eğer
- Bir ifadeyi yürütmeye dayanan başka bir şey.
11
sonra, sonra (örneğin oluşturmak/tabloları değiştirme) kendi çıkışını ilgili olmadan veritabanında şey yürütmek execSQL kullanmak, ancak sorguda karşı karşılığında bazı sonuçlar bekliyoruz (örn kayıtları seçin) isterseniz rawQuery kullanın
İlgili konular
açıkladı .. execSQL bir şey döndürmez ve oluşturma, güncelleme vb. için kullanılır ve rawQuery imleçleri döndürür vb. –
Ayrıntılı açıklama için çok teşekkürler :) Şerefe! –