12

我有一个 sqlite 数据库,我需要按一个包含一些以重音字符开头的单词的列进行排序。这些项目的排序错误,它们出现在结果的末尾:

安东尼奥·邦佐·泽托·安吉拉

当 sqlite 数据库在该列中有重音符号时,如何正确排序?

谢谢

4

2 回答 2

26

任何一个

... ORDER BY column COLLATE UNICODE

或者

... ORDER BY column COLLATE LOCALIZED

参考:

除了 SQLite 的默认排序器之外BINARY,Android 还提供了两个LOCALIZED,它们随系统的当前语言环境而变化,以及UNICODEUnicode 排序算法,不针对当前语言环境量身定制。

例子:

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
于 2013-11-11T12:27:22.950 回答
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重音字符可以正常工作。

于 2013-11-11T12:32:54.017 回答