如何使Android Sqlite中的查询以拉丁语顺序返回

时间:2014-03-18 22:25:19

标签: android sqlite

我的app app中有一个查询,如下所示

SELECT N.NOME AS NUTRIENTE FROM NUTRIENTES WHERE CODNUTRIENTE IN (" + nutrientes + ") ORDER BY  N.NOME COLLATE NOCASE

返回结果

Cálcio
ED Suinos
Fibra Bruta
Fósforo
Gordura
Lisina
Metionina
Proteina
Sódio´
Ácido
Triptofano

但它应该以正确的顺序返回

Ácido
Cálcio
ED Suinos
Fibra Bruta
Fósforo
Gordura
Lisina
Metionina
Proteina
Sódio
Triptofano

任何人都可以帮助我或给出指示或文档阅读,我在sqlite ofical网站搜索答案但我没有找到任何东西。 我创建数据库

公共类MySQLiteHelper扩展了SQLiteOpenHelper {

  private static Context context;


  public static final String TABLE_NUTRIENTES = "NUTRIENTES";

  public static final String CREATE_TABLE_NUTRIENTES = "CREATE TABLE NUTRIENTES ( "
          + " CODNUTRIENTE   INTEGER primary key autoincrement, "
          + " NOME           VARCHAR(25) , "
          + " CODUNIDADE     INTEGER, "
          + " COMENTARIO     VARCHAR(1000) , "
          + " MULTIPLICADOR  REAL, "
          + " VISIVEL        INTEGER, "
          + " TRAVADO        INTEGER, "
          + " FOREIGN KEY (CODUNIDADE) REFERENCES UNIDADES (CODUNIDADE) ON UPDATE CASCADE "
          + "   ); ";

  private static String DATABASE_NAME = ((Config)Config.getInstance(context)).getValue("BancoDeDados") + ".db";
  private static final int DATABASE_VERSION = 1;


  public MySQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context=context;
  }

  public MySQLiteHelper(Context context, String nomeBanco) {
      super(context, nomeBanco + ".db", null, DATABASE_VERSION);
      this.context=context;
  }

@Override
  public void onCreate(SQLiteDatabase database) {
    if (!database.isReadOnly()) {
          database.execSQL("PRAGMA foreign_keys=ON;");
    }
    criaTabelas(database);


    preencheNutrientes(database);


  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w(MySQLiteHelper.class.getName(),
        "Upgrading database from version " + oldVersion + " to "
            + newVersion + ", which will destroy all old data");


    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NUTRIENTES);


    onCreate(db);
  }

  public void criaTabelas(SQLiteDatabase database) {

    database.execSQL(CREATE_TABLE_NUTRIENTES);

  }


  public void preencheNutrientes(SQLiteDatabase database) {
      List<String[]> valueslist = Util.readCsv(context,"nutrientes.csv");

      for(String[] dados: valueslist){  
            ContentValues insertValues = new ContentValues();
            insertValues.put("CODNUTRIENTE",dados[0]);
            insertValues.put("NOME",dados[1]);
            insertValues.put("CODUNIDADE",dados[3]);
            insertValues.put("COMENTARIO",dados[2]);
            insertValues.put("MULTIPLICADOR",dados[4]);
            insertValues.put("VISIVEL",dados[5]);
            insertValues.put("TRAVADO",dados[6]);
            database.insert("NUTRIENTES", null, insertValues);
     }
  }


@SuppressLint("Override")
public static String getDatabaseName() {
    return DATABASE_NAME;
}
@Override
public void onOpen(SQLiteDatabase db) {
    if (!db.isReadOnly()) {
        db.execSQL("PRAGMA foreign_keys=ON;");
    }
    super.onOpen(db);
}

public static void changeDatabase(String nomeBD) {
    DATABASE_NAME = nomeBD + ".db";
}

}

1 个答案:

答案 0 :(得分:0)

我打算给你答案,但我发现我遇到了同样的问题。无论如何,我刚刚找到了解决办法:)。

您只需在表格的定义中添加COLLATE LOCALIZED 即可。 VARCHAR(25) COLLATE LOCALIZED使用TEXT COLLATE LOCALIZEDNOME

请记住,您需要重新创建数据库以应用此更改或在onUpgrade函数中编写相应的代码。

通过这样做,您无需在COLLATE声明中使用SELECT