繁体   English   中英

如何使用保存的首选项在textview中添加点,并在24小时后将这些点转移到另一个textview中?

[英]How to add points in textview using saved preferences and transfer these points to another textview after 24 hours?

我的问题似乎太笼统了,但让我试着简短一点。 我有两个textview如下:

TextView 1:包含今天获得的积分

<TextView
                        android:id="@+id/pointsToday"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Points: 00" />

TextView 2:包含昨天获得的积分

<TextView
                        android:id="@+id/pointsYesterday"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Points: 00" />

这些点是在单击按钮时获得的,在单击按钮的侦听器中,我有这段代码可以添加点

pointsValue = todayPoints + 1;
saveCoinss.edit().putFloat("$", (float) todayPoints).apply();

我用这种方法将积分保存在“保存的首选项”中

SharedPreferences saveCoinss = this.getSharedPreferences("mySaverCoins", Context.MODE_PRIVATE);
    saveCoinss.edit().putFloat("$", (float) todayPoints).apply();

当我单击按钮时,我在TextView中显示的点是: android:id="@+id/pointsToday"

所以现在的问题是,我要在一天(24小时)后从显示在android:id="@+id/pointsToday"显示转移这些点,并将它们转移到id为android:id="@+id/pointsYesterday" 这意味着,从一天的开始,id / pointsToday将为00,而id / pointsYesterday将获得id / pointsToday中的积分。 那么我该怎么做。

如果使用数据库,则可以更好地解决,例如可以使用Room

Point.java

import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import org.threeten.bp.OffsetDateTime;

@Entity(tableName = "point")
public class Point {
    @PrimaryKey(autoGenerate = true)
    private long id;
    @ColumnInfo(name = "value")
    private int value;
    @ColumnInfo(name = "point_date")
    private OffsetDateTime pointDate;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public OffsetDateTime getPointDate() {
        return pointDate;
    }

    public void setPointDate(OffsetDateTime pointDate) {
        this.pointDate = pointDate;
    }
}

PointDao.java

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import java.util.List;

@Dao
public interface PointDao {

    @Query("SELECT * FROM point")
    List<Point> getAll();

    @Query("SELECT * FROM point WHERE id IN (:pointIds)")
    List<Point> getAllByIds(int[] pointIds);

    @Query("SELECT * FROM point WHERE point_date=date(:dateForSearch) LIMIT 1")
    Point getByPointDate(String dateForSearch);

    @Query("SELECT * FROM point ORDER BY point_date DESC LIMIT 1")
    Point getLastInsertedPoint();

    @Query("SELECT SUM(value) AS total_points FROM point")
    int getPointsSum();

    @Insert
    void insert(Point point);

    @Insert
    void insertAll(Point... points);

    @Insert
    void insertAll(List<Point> points);

    @Delete
    void delete(Point point);

    @Query("DELETE FROM point")
    void deleteAll();
}

通过PointDao类中的getPointsSum方法,了解对所有值求和的PointDao

AppDatabase.java

import android.arch.persistence.room.Database;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
import android.arch.persistence.room.TypeConverters;
import android.content.Context;

@Database(entities = {Point.class}, version = 1)
@TypeConverters(OffsetDateTimeConverter.class)
public abstract class AppDatabase extends RoomDatabase {
    private static AppDatabase INSTANCE;

    public abstract PointDao pointDao();

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(
                    context.getApplicationContext(),
                    AppDatabase.class,
                    "point-database"
            )
                    // allow queries on the main thread.
                    // Don't do this on a real app! See PersistenceBasicSample for an example.
                    .allowMainThreadQueries()
                    .build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}

OffsetDateTimeConverter.java

import android.arch.persistence.room.TypeConverter;
import android.text.TextUtils;
import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.format.DateTimeFormatter;

public class OffsetDateTimeConverter {
    private static final DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;

    @TypeConverter
    public static OffsetDateTime toOffsetDate(String value) {
        if (!TextUtils.isEmpty(value)) {
            return formatter.parse(value, OffsetDateTime::from);
        }
        return null;
    }

    @TypeConverter
    public static String fromOffsetDate(OffsetDateTime date) {
        if (date != null) {
            return date.format(formatter);
        }
        return null;
    }
}

OffsetDateTimeChecker.java

import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.format.DateTimeFormatter;
import org.threeten.bp.temporal.ChronoUnit;

public class OffsetDateTimeChecker {

    public static OffsetDateTime getYesterday() {
        return OffsetDateTime.now().minus(1, ChronoUnit.DAYS);
    }

    public static boolean isYesterday(OffsetDateTime offsetDateTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE;
        String offsetDateTimeText = offsetDateTime.format(formatter);
        String yesterdayText = getYesterday().format(formatter);
        return yesterdayText.equals(offsetDateTimeText);
    }

    public static boolean isToday(OffsetDateTime offsetDateTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
        String offsetDateTimeText = offsetDateTime.format(formatter);
        String todayText = OffsetDateTime.now().format(formatter);
        return todayText.equals(offsetDateTimeText);
    }
}

将以下依赖项添加到您的应用程序的build.gradle

def room_version = "1.1.0"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
testImplementation "android.arch.persistence.room:testing:$room_version"
implementation 'com.github.ThreeTen:threetenbp:v1.3.6'

我使用https://github.com/ThreeTen/threetenbp以获得更轻松,更快速的性能,并且可以支持jdk6和jdk7,但是如果您以android SDK26为目标并使用java8,则可以使用java8提供的默认值。 只需记住,存储在本地设备中的所有内容(无论是数据库还是共享首选项)都可以被设备所有者入侵。 因此,您必须为保存的数据实施安全机制。 您还需要处理时区差异,或者如果用户通过更改设备时间来作弊来作弊。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM