2017-03-21 7 views
-1

私のデータベースで数値を並べ替えて、ゲームの5つの高い得点を表示しようとしています。問題は、ソートしようとすると、最初の桁でソートするか、2桁の数字が高得点に印刷されないことです。この混乱は、deleteProduct()メソッドにあります。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

をお使いの場ではなく、(不良によるデータベース設計スキルに)数値型であることの、TEXTであるので、明示的に1桁の数字に先頭の0をつける必要があります。それ以外の場合は、**文字のソート**では10が2より小さくなります。02は10よりも小さいのに対し、 –

答えて

0
SELECT _id FROM products ORDER BY productname DESC LIMIT 5 

このクエリはproductname列の値でソートします。これらの値が文字列の場合、ソート順は最初の文字で定義されます。

代わりに番号を保存する必要があります。あなたのデータベースを変更できない場合

、並べ替えのためにそれらを使用する前に数値に値を変換します

SELECT _id FROM products ORDER BY CAST(productname AS NUMBER) DESC LIMIT 5 
関連する問題