-1

実績をチェックする方法があり、それを適切に機能させようとしています。String を受け取り、それを long に変換してから、データベース内の String 値に対してチェックします (これは long に変換されます)。

コードは次のとおりです。

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

IhetimeStringは、カレンダーから取得され、long 型から文字列に変換されたミリ秒単位の現在の時刻です。特に、timeInt が topTime よりも大きくないことがわかっている場合に、この関数が true を返し続ける理由がわかりません。

また、この関数は を返しtrueますが、データベースをチェックしたため、その更新クエリは実行されていませんが、完了した値はまだ "no" であり、name="Beat top record" です。

4

1 に答える 1

3

あなたのメソッドはtrue、条件に従って正しいものを返しています。詳しくご説明いたします。

あなたが質問で言ったように、あなたの timeString 変数には、1900 年 1 月 1 日からのミリ秒の長い値である現在のミリ秒が含まれています。問題の値)。トップタイムが昨日 (つまり、2012 年 5 月 31 日) であるとします。この値を今日の現在の時刻と比較すると、メソッドはtrueどちらが正しいかを返します。

偽の値を確認するために、今日の日付 (つまり 2012 年 6 月 1 日) よりも大きい将来の時刻を保存し、メソッドを実行することをお勧めします。確実にfalse値が返されます。

于 2012-06-01T03:02:45.873 に答える