2012-06-01 145 views
-1

我有一種方法可以檢查成果,並試圖使其正常工作。它需要一個字符串並將其轉換爲一個長,然後檢查針對所述數據庫中的字符串值(將其轉化爲長)方法始終返回true

這裏是代碼:

public boolean checkAchievements(String timeString) { 
    long timeInt = Long.parseLong(timeString); 
    boolean newAchievement = false; 
    SQLiteDatabase db = this.getWritableDatabase(); 

    Cursor cursor = db.rawQuery("SELECT millis FROM records ORDER BY CAST(millis as SIGNED) DESC", null); 
    cursor.moveToFirst(); 
    long topTime = Long.parseLong(cursor.getString(0)); 
    cursor.close(); 

    if (timeInt > topTime) { 
     db.rawQuery("update achievements set completed='yes' where name='Beat top record'", null); 
     newAchievement = true; 
    } 

    db.close(); 

    return newAchievement; 
} 

IHE timeString是當前時間在毫秒從日曆中獲取並從長轉換爲字符串。我不知道爲什麼這個函數保持返回true,特別是當我知道timeInt不大於topTime時。

此外,即使此函數返回true,該更新查詢甚至沒有運行,因爲我檢查了數據庫,並且完成的值仍然是「否」,其中名稱=「擊敗頂部記錄」。

+1

當你說你「知道一個事實,即timeInt比topTime不大於」是因爲你檢查調試器中的值?在題外話題上:你可能會考慮在你的SELECT查詢中加入「LIMIT 1」。 –

+0

好了,我的UPDATE查詢也不起作用,即使函數返回true。 – scarhand

+0

您確定設備/模擬器正在運行您認爲它的代碼嗎? –

回答

3

你的方法正在返回true,其是按照條件是正確的。讓我詳細解釋你。

正如你所說的那樣,你的timeString變量包含了當前的毫秒數,它是自1900年1月1日以來的一個很長的毫秒值。你在數據庫中的時間值是比當前時間長的值(我假設,沒有考慮到它的價值)。所以假設你有最好的時間是昨天(即2012年5月31日)。現在,當您將此值與當前的當前時間進行比較時,您的方法將返回true,這本身就是正確的。

對於檢查虛假值,我想建議您存儲一些比今天的日期(即2012年6月1日)更大的未來時間並執行該方法,它肯定會返回false的值。

+0

你假設事實不詳細。沒有跡象表明'timeString'指的是任何特定的值,我們不知道數據庫中的時間戳是什麼,並且你沒有解決'update'不起作用的事實。所以我認爲如果你所假設的所有事情都是真實的,那麼它就是「回到真實的,這是正確的」,但我們沒有辦法知道。 –

+0

同意你的看法,讓問scarhand把topTime的價值問題@KenWhite – Lucifer

+0

@KenWhite - OP做的職位,「'timeString'是從日曆抓起,並轉換成從長字符串毫秒當前時間」。這個答案似乎是最可能的解釋,但只有OP可以肯定地說。順便提一下,路西法。 –