2011-01-30 27 views
7

Ben çok temel bir durum var Çalışmıyor()" android olarakAndroid SQLite SİPARİŞ İLE

, şu kullanarak) (rawQuery kullanarak bir imleç oluşturduğunuzda:

SELECT w.id, w.name, w.def, w.rand FROM words w ORDER BY w.rand ASC; 

Döndürülen imleç doğru sırada yineleme yapmaz. Örneğin. aşağıdaki sırayla rand değerleri içeren sütunlar çıktılacaktır:

-1298882092 
-2138143484 
-1115732861 
118839193 
... 

Burada neler olup bittiğini bilen var mı? Bu işe yaramaz mı? Eğer SQLiteManager'da tam olarak aynı sorguyu çalıştırırsam, sonuçları doğru sırada döndürür, bu yüzden bu, android/imleçe özgü gibi görünüyor.

GÜNCELLEME: Burada

android kod, ben denedim birden çok yolu:

Denemesi 1:

Cursor cursor = db.rawQuery("SELECT w.id, w.name, w.def, w.rand FROM words w ORDER BY w.rand ASC", new String[]{}); 

Denemesi 2:

Cursor cursor = db.query("words", new String[]{"id", "name", "def", "rand"}, 
      null, null, null, null, "rand ASC"); 

Her iki durumda da Aşağıdaki gibi yineliyorum:

while(cursor.moveToNext()) { 
    ... 
    Log.i("Test", cursor.getInt(3)); 
    ... 
} 
+0

Değil Android'de ama burada iş gibi görünüyor: http://ideone.com/GEnG3 –

+1

Evet, sqlitemanager'da da çalışıyor, dolayısıyla Android'e özgü olduğunu düşünüyorum. Mevcut davada ayrıca 5k satır ve rand sütununda bir dizin bulunur. – ghempton

+0

Android kodunu yayınlayabilir misiniz? –

cevap

6

Çözdüm, basit bir denetimdi. Random() işlevi, bir java int veri türünden daha büyük olabilen bir değer döndürür. Bu taşma üretiyordu. GetLong() konumuna geçti ve her şey iyi çalışıyor. İmleç, doğru bir şekilde yineleniyordu.

+1

İyi iş çıkaran bir iş.Sessiz int kesilme hataları hata ayıklamak gerçekten zor olabilir –

1

Android imleç, rawquery ve grup tarafından bir sorun yaşadım. Sonuç sipariş verilmedi.

Bu

tablodur:

public static final String I_ID = "iid"; 
public static final String I_QID = "qid"; 
public static final String I_STATUS = "status"; 
public static final String I_PDATE = "pub_date"; 
public static final String I_TYPE = "tipo"; 
public static final String I_TITLE = "titolo"; 
public static final String I_LINK = "link"; 
public static final String I_QR = "qrcode"; 
public static final String I_DESC = "descrizione"; 

private static final String C_ITEM_T = 
     "CREATE TABLE \""+T_ITEM+"\" ("+ 
     "\""+I_ID+"\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+ 
     "\""+I_QID+"\" INTEGER NOT NULL REFERENCES "+T_QUERY+"("+Q_ID+") ,"+ 
     "\""+I_STATUS+"\" INTEGER NOT NULL,"+ 
     "\""+I_PDATE+"\" TEXT NOT NULL,"+ 
     "\""+I_TYPE+"\" TEXT NOT NULL,"+ 
     "\""+I_TITLE+"\" TEXT NOT NULL,"+ 
     "\""+I_LINK+"\" TEXT UNIQUE NOT NULL,"+ 
     "\""+I_QR+"\" TEXT UNIQUE NOT NULL,"+ 
     "\""+I_DESC+"\" TEXT"+ 
     ");"; 

public static final String A_ID = "aid"; 
public static final String A_IID = "iid"; 
public static final String A_SIZE = "grandezza"; 
public static final String A_DURATION = "durata"; 
public static final String A_CHANNELS = "canali"; 
public static final String A_RATE = "sampleRate"; 
public static final String A_TORRENT = "torrent"; 
public static final String A_DOWNLOAD = "download"; 
public static final String A_LICENSE_URL = "licenza_url"; 
public static final String A_TAGS = "tags"; 
public static final String A_CREATOR = "creatore"; 

private static final String C_ATTR_T = 
     "CREATE TABLE \""+T_ATTR+"\" ("+ 
     "\""+A_ID+"\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+ 
     "\""+A_IID+"\" INTEGER NOT NULL REFERENCES "+T_ITEM+"("+I_ID+") ,"+ 
     "\""+A_SIZE+"\" LONG NOT NULL,"+ 
     "\""+A_DURATION+"\" LONG NOT NULL,"+ 
     "\""+A_CHANNELS+"\" TEXT NOT NULL,"+ 
     "\""+A_RATE+"\" TEXT NOT NULL,"+ 
     "\""+A_TORRENT+"\" TEXT NOT NULL,"+ 
     "\""+A_DOWNLOAD+"\" TEXT NOT NULL,"+ 
     "\""+A_LICENSE_URL+"\"TEXT,"+ 
     "\""+A_TAGS+"\" TEXT,"+ 
     "\""+A_CREATOR+"\" TEXT,"+ 
     "UNIQUE ("+A_ID+","+A_IID+")"+ 
     ");"; 

Ve bu mayın sorgulama:

public static final String FILL_GRID = "SELECT * "+ 
     "FROM "+ Db.T_ITEM + " i " + 
     "LEFT OUTER JOIN "+Db.T_ATTR+" a ON (i."+Db.I_ID+"=a."+Db.A_IID+ ")"+ 
     " WHERE i."+Db.I_QID+" = ? AND i."+Db.I_STATUS+" <> "+Db.STATUS_DELETED + 
        " GROUP BY ? "; 

ve burada ben bunu nasıl kullandığımız: eminim

Cursor c = db.rawQuery(FILL_GRID, new String[]{String.valueOf(qid), order}); 

qid olduğunu bir tam sayı ve sipariş i.titolo ASC veya DESC

benim için çalıştı tek geçici çözüm rawquery çağrı yönteminde clausole tarafından grubunu hareketli sorguyu değiştirmek geçerli:

public static final String FILL_GRID = "SELECT * "+ 
     "FROM "+ Db.T_ITEM + " i " + 
     "LEFT OUTER JOIN "+Db.T_ATTR+" a ON (i."+Db.I_ID+"=a."+Db.A_IID+ ")"+ 
     " WHERE i."+Db.I_QID+" = ? AND i."+Db.I_STATUS+" <> "+Db.STATUS_DELETED; 

Cursor c = db.rawQuery(FILL_GRID + " ORDER BY " + order, new String[]{String.valueOf(qid)});