通过带有重音字符的列排序sqlite的问题(Á)

时间:2013-11-11 12:13:28

标签: android sqlite

我有一个sqlite数据库,我需要按一个列来排序,这个列有一些以重音字符开头的单词。这些物品订购错误,它们出现在结果的末尾:

安东尼奥 BONZO Zeto 安吉拉

当sqlite数据库在该列中有重音时,如何正确订购?

感谢

2 个答案:

答案 0 :(得分:20)

无论

... ORDER BY column COLLATE UNICODE

... ORDER BY column COLLATE LOCALIZED

Reference:

  

除了SQLite的默认BINARY整理器之外,Android还提供了两个LOCALIZED,它随系统的当前语言环境而变化,而UNICODE则是Unicode整理算法而非定制的到当前的语言环境。

示例:

db.execSQL("CREATE TABLE foo(a TEXT);");
db.execSQL("INSERT INTO foo VALUES('Antonio'),('Bonzo'),('Zeto'),('Ángela');");

Cursor c = db.rawQuery("SELECT * FROM foo ORDER BY a COLLATE UNICODE", null);
while (c.moveToNext()) {
   Log.d("foo", c.getString(0));
}

输出:

Ángela
Antonio
Bonzo
Zeto

答案 1 :(得分:1)

要支持数据库中的重音字符,您可以使用Normalizer类正确存储文本:

import java.text.Normalizer;

...

// Code to store the normalized data
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, Normalizer.normalize(name, Normalizer.Form.NFD));

...

// Code to read the normalized data
int indexName = cursor.getColumnIndex(COLUMN_NAME)
String name = Normalizer.normalize(cursor.getString(indexName), Normalizer.Form.NFC));

以这种方式存储数据,SQLite使用者ASCDESC可以使用重音字符正常工作。