2017-03-18 1 views
-1

그래서 내가 만들고있는 게임에 대해 5 개의 높은 점수를 받았습니다. 지금은 점수가 정렬되어 있고 if가 5가되면 점수를받지 않는 if 문이 있습니다. 문제는 사용자가 if 문 때문에 데이터베이스에 포함되지 않지만 사용자가 새로운 높은 점수를 얻었지만 이미 가지고있는 것을 재구성하지 않고이 문제를 해결할 수있는 방법을 생각할 수 없다는 것입니다. 내가 사용하고자하는 논리를 가지고 있지만 그것을 구현하는 방법을 모르겠습니다 (addProduct() 메소드 내부).SQLite에서 최고 점수를 설정하는 방법

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; 

} 

}

+0

결과 집합을 내림차순으로 정렬하고 상위 5 개를 가져옵니다. 모두 하나의 싱글 질문. –

답변

0

알고리즘 : 1. 정렬 후, DB를 조회하고 새로운 점수가 인 경우 이전의 높은 점수 2의보다 큰 경우를 결정, 지시하는 플래그를 추가 그것은 새로운 높은 점수입니다. 3. 조건부 논리 (if 문)에서 플래그를 사용하여 새로운 높은 점수를 받았는지 확인하십시오. 4. 그렇다면 새 최고 점수를 DB에서 가장 낮은 점수로 바꾸십시오.

0

새로운 유효한 높은 점수를 얻었 으면 이전의 가장 작은 점수를 삭제해야합니다.

가장 쉬운 방법은 항상 새로운 높은 점수를 삽입 한 다음 (작은 경우에도) 가장 큰 5 개의 점수를 제외한 모든 항목을 삭제하는 것입니다.

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

은 (당신이 쓰기 가능 데이터베이스()를 얻을 호출 할 필요가 데이터베이스를 변경할 수 있도록 (. 이것은 또한 아직 다섯 가지 항목이 사건을 처리) 및 SQL 테이블은 그래서 순서가있다 기록한 것과 동일한 순서로 레코드를 읽을 수 있다고 보장 할 수 없으므로 테이블에 점수를 저장해야합니다.)

관련 문제