2017-03-21 3 views
-1

게임에 대한 5 개의 높은 점수를 인쇄하려면 데이터베이스에서 숫자를 정렬하려고합니다. 문제는 정렬하려고 할 때 첫 번째 숫자로 정렬하거나 두 자리 숫자가 내 높은 점수로 인쇄되지 않습니다. 엉망진창은 deleteProduct() 메소드에 있습니다. productname 열의 값을 기준으로SQLite에서 두 자리 숫자를 주문할 수 없습니다

DBHandler 클래스

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{ 
     ContentValues values = new ContentValues(); 
     values.put(COLUMN_PRODUCTNAME, product.get_productname()); 
     db.insert(TABLE_PRODUCTS, null, values); 
     deleteProduct(); 
     db.close(); 
    } 
} 

//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(){ 
    SQLiteDatabase db = getWritableDatabase(); 
    db.execSQL("DELETE FROM products WHERE _id NOT IN"+ 
       //only reading first digit of double digit numbers 
       //" (SELECT _id FROM products ORDER BY productname DESC LIMIT 5)"); 
      //this runs but isnt putting double digit scores into the high score textView 
      " (SELECT _id FROM products ORDER BY length(productname), productname DESC LIMIT 5)"); 


} 


//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"); 
    //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

을 당신의 분야 대신 (빈약 한 데이터베이스 설계 기술에) 숫자 유형 인의 텍스트이기 때문에, 1 자리 숫자 "선행 숫자 0"을 명시 적으로 채워야합니다. 그렇지 않으면 ** 문자 정렬 **에서 10은 2보다 낮습니다. 02는 10보다 작습니다. –

답변

0
SELECT _id FROM products ORDER BY productname DESC LIMIT 5 

이 쿼리 정렬합니다. 이러한 값이 문자열 인 경우 정렬 순서는 첫 번째 문자로 정의됩니다.

대신 숫자를 저장해야합니다. 당신이 당신의 데이터베이스를 변경할 수없는 경우

, 정렬을 사용하기 전에 숫자로 값을 변환 :

SELECT _id FROM products ORDER BY CAST(productname AS NUMBER) DESC LIMIT 5 
관련 문제