如何在SQLite中设置高分

时间:2017-03-18 19:49:23

标签: android sqlite android-sqlite

所以我在比赛中得到5分。现在分数被分类,我有一个if语句,一旦有五个就停止分数。问题是如果用户有一个新的高分,它将不会被包含在数据库中,因为我的if语句,但我想不出一种方法来解决这个问题而不重构我已有的。我有我想要使用的逻辑,但我不知道如何实现它(在addProduct()方法内)。

public class MyDBHandler extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 4;
private static final String DATABASE_NAME = "products.db";
public static final String TABLE_PRODUCTS = "products";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_PRODUCTNAME = "productname";

public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + TABLE_PRODUCTS + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_PRODUCTNAME + " TEXT " +
            ");";
    db.execSQL(query);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_PRODUCTS);
    onCreate(db);
}

//add a new row to the database
public void addProduct(Products product){

    SQLiteDatabase db = this.getReadableDatabase();
    if(DatabaseUtils.queryNumEntries(db, TABLE_PRODUCTS) <= 4){
        ContentValues values = new ContentValues();
        values.put(COLUMN_PRODUCTNAME, product.get_productname());
        db.insert(TABLE_PRODUCTS, null, values);
        db.close();
    }
    else if(!(DatabaseUtils.queryNumEntries(db, TABLE_PRODUCTS) <= 4) && /* new score is a highscore */){
        //how to insert new high score into correct spot and delete last high score
    }
}

//code coming from MainActivity
public void addButtonClicked(String highscore1){
    Products product = new Products(highscore1);
    addProduct(product);
    updateDatabase();
}

//code coming from MainActivity
public void updateDatabase(){
        String dbString = databaseToString();
        MainActivity.productText.setText(dbString);
}

//delete a product from the database
public void deleteProduct(String productName){
    SQLiteDatabase db = getWritableDatabase();
    db.execSQL("DELETE FROM " + TABLE_PRODUCTS + " WHERE " + COLUMN_PRODUCTNAME + "=\"" + productName + "\";" );
}


//print out the database as a string
public String databaseToString(){
    String dbString = "";
    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";


    //Cursor point to location in your results
    Cursor c = db.query(TABLE_PRODUCTS, null, null, null, null, null, COLUMN_PRODUCTNAME +" DESC");
    //Cursor c = db.rawQuery(query, null);
    //Move to the first row in your results
    c.moveToFirst();

    while(!c.isAfterLast()){
        if(c.getString(c.getColumnIndex("productname")) != null){
            dbString += c.getString(c.getColumnIndex("productname"));
            dbString += "\n";
        }
        c.moveToNext();

    }


    db.close();
    return dbString;

}

}

2 个答案:

答案 0 :(得分:0)

算法: 1.排序后,查询您的数据库并确定新分数是否大于之前的任何高分 2.如果是,请添加一个标志,表示这是一个新的高分。 3.在条件逻辑(if语句)中,使用该标志确定您是否有新的高分。 4.如果是,请用数据库中的最低分数替换新的高分。

答案 1 :(得分:0)

如果您有新的有效高分,则需要删除较旧的最小分数。

最简单的方法是始终插入新的高分(即使它更小),然后删除除最大的五个以外的所有条目。 (这也处理了还没有五个条目的情况。)

public void addProduct(Products product) {
    SQLiteDatabase db = this.getWritableDatabase();
    try {
        db.beginTransaction();
        try {
            ContentValues values = new ContentValues();
            values.put(COLUMN_PRODUCTNAME, product.get_productname());
            values.put("score", ...);
            db.insert(TABLE_PRODUCTS, null, values);

            db.execSQL("DELETE FROM products WHERE _id NOT IN"+
                       " (SELECT _id FROM products ORDER BY score DESC LIMIT 5)",
                       null);

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    } finally {
        db.close();
    }
}

(为了能够更改数据库,您需要调用get Writable Database();并且SQL表是无序的,因此无法保证您以相同的顺序读取记录已经写好了,所以你需要将分数存储在表格中。)