android - SQLite 语言独立查询数字

标签 android string sqlite numbers

在使用 html 解析器收集大量数据后,我编写了一个有趣的 android 应用程序,它具有内部 sqlite 数据库,我发现我的数字被保存为 数据库中的文本,是用英语编写的,所以在我的国家尝试用波斯语进行查询不会返回任何数字

String q = "SELECT * FROM studentIDs WHERE field1  LIKE '%"+name+"%' OR field2  LIKE '%"+name+"%'";

虽然在 field1 这两个字符串上都做得很好,但它不会在 field2 上工作,该数字存储为字符串,我应该如何对数字执行与语言无关的查询?

我无法将字符从英文更改为其他字符我想要两种语言的支持并且我无法将其类型更改为整数因为有些记录是英文名称

抱歉我的英语不好,提前致谢

最佳答案

由于您的数据类型是字符串,这意味着您可以将任何字符序列存储到它(取决于您的 sqlite 编码配置,例如 utf8),而 Sqlite 不关心也不应该关心它。

这里有一个简单的解决方案:

只需在对数据库进行任何查询之前编写一个简单的映射器即可:

String mapToEn(String query) {
    return query
            .replace('۰', '0')
            .replace('۱', '1')
            .replace('۲', '2')
            .replace('۳', '3')
            .replace('۴', '4')
            .replace('۵', '5')
            .replace('۶', '6')
            .replace('۷', '7')
            .replace('۸', '8')
            .replace('۹', '9');
}

并在执行对数据库的查询之前在您的查询或查询参数上使用它:

Result query(mapToEn(query));

编辑:

既然你说了

I can't change it's type to integer cause some recored's are english name

我认为您在 field1 中的数据是数字和字符的组合,既然您澄清了它只包含数字或字符串数​​据,您就有了另一个解决方案。

数据库架构迁移

由于您的数据库模式不再符合您的要求,您必须对其进行一些更改。您需要区分您输入的数据类型,只需添加两个新列作为 field_strfield_num

基本上你应该编写一个数据库迁移,负责将 field1 列的数据从 String 转换为 Integer(如果它是 Integer 而不会丢失任何数据),以下是你应该执行的步骤:

  1. 分别向表中添加一个整数列和一个字符串列 field_numfield_str
  2. 遍历表并解析 field1 中的所有字符串 到 Integer 并将它们插入到 'field_numcolumn,并将不可解析的插入到 field_str` 列。
  3. 相应地更改您的查询。

由于 sqlite 不支持列删除,您要么必须向现有表添加一个新列并保留旧数据,要么您可以创建一个新表并将所有数据迁移到新表:

这里是一些假设情况:

sqlite> .schema
CREATE TABLE some_table(
 id INTEGER PRIMARY KEY, 
 field1 TEXT,
 field2 TEXT, 
);
sqlite> select * from some_table; 
id          field1      field2
----------  ----------  ------
0           1234         name<br>   
1           bahram       name  

现在创建另一个表

sqlite> CREATE TABLE new_some_table(
   ...>  id INTEGER PRIMARY KEY, 
   ...>  field_str TEXT, 
   ...>  field_num INTEGER,
   ...>  field2 TEXT,
   ...> ) ; 

现在从旧表中复制你的数据

sqlite> INSERT INTO new_some_table(id, field_str, field2)
   ...> SELECT id, field1, field2, FROM some_table ;

sqlite> INSERT INTO new_some_table(id, field_num)
   ...> SELECT id, field1, FROM some_table WHERE typeof(field1) = "integer" ;

现在您可以根据您拥有的数据类型查询您的表。

考虑使用提供迁移工具的 ORM,例如 Google 的 Room 或 dbflow。

关于android - SQLite 语言独立查询数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49115184/

相关文章:

java - 如何修复Java中的 'The following classes could not be found: - android.support.v7.widget.Toolbar'错误

android - 如何知道是否已在 android 中选择了微调项?

java - 单选按钮包

php - strtoupper 可以处理字母和数字吗

java - 如何将文本字段添加到 java swing 中按钮的 Action 监听器?我也有关于字符串的疑问

java - Android Java 语法错误

database - Actionscript-3 类 Hibernate 框架

android - 位图解码文件返回空

Android SQLite 递增列值

php - 如何使用 strpos() 函数查找字符串中多个单词的位置?