当前位置: 首页 > 知识库问答 >
问题:

SQLite语言无关的数字查询

哈栋
2023-03-14

我写了一个Android应用程序的乐趣,有内部sqlite数据库后,使用html解析器收集了许多数据,我发现我的数字是保存在数据库中的文本,是用英语写的,所以在波斯语做查询,在我的国家的人尝试将返回数字上没有

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

虽然在两个字段1上做的很好,这是字符串,它不会在字段2上工作,数字存储为字符串,我应该如何对数字执行语言无关的查询?

我不能改变字符从英语到其他我想支持两种语言,我不能改变它的类型为整数,因为有些记录是英文名称

对我的英语很抱歉,提前谢谢

共有3个答案

钱志
2023-03-14

我的想法是做数字的半翻译,首先像这样检查每个字符,看看它是否是任何语言中的数字

static boolean  isDigit(char ch)//from java doc 
Determines if the specified character is a digit.

然后使用getNumericValue(char)

getNumericValue(char)的好处是,它也适用于像“”和“”这样的字符串,其中和分别是东阿拉伯语和印地语/梵语中的数字5。

赵驰
2023-03-14

作为一个简单的知识,所有数据库将数据存储在一个文件中,并将数据存储为字符串。它取决于我们的数据库驱动程序来解释它们,并根据表模式将它们转换为其他数据类型。

所以,不同的语言也作为字符串存储在数据库中。不管是数字还是字符。对于每种语言,您都必须输入语言转换器。

所以,让你们的数据库对你们和所有其他国家的语言都可用的想法是编码和解码。将任何国家/地区编号转换为英文,同时保存到数据库中,反之亦然。

你必须为像这样的对话制定所有语言的方法。或者创建自己的库类来通用它。希望你觉得这有用。

申屠健
2023-03-14

由于您的数据类型是String,这意味着您可以将任何字符序列存储到它(取决于您的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));

编辑:

自从你说

我无法将其类型更改为整数,因为某些记录的是英文名称

我认为字段1中的数据是数字和字符的组合,现在您澄清了它只包含数字或字符串数据,您有了另一种解决方案

数据库模式迁移

因为您的数据库模式不再符合您的需求,所以您必须对其进行一些更改。您需要区分输入的数据类型,只需添加两个新列,即field\u strfield\u num

基本上,你应该编写一个数据库迁移,负责将field d1列的数据从String转换为整数,如果它是整数,而不会丢失任何数据,下面是你应该做的步骤:

  1. 在表中分别添加一个整数和一个字符串列field\u numfield\u str
  2. 遍历该表,将field1中的所有字符串解析为整数,并将它们插入到'field_num列中,将不可解析的字符串插入到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,如谷歌的房间或dbflow。

 类似资料:
  • 通过前面的学习我们了解到切片其实就是多个相同类型元素的连续集合,既然切片是一个集合,那么我们就可以迭代其中的元素,Go语言有个特殊的关键字 range,它可以配合关键字 for 来迭代切片里的每一个元素,如下所示: 第 4 行中的 index 和 value 分别用来接收 range 关键字返回的切片中每个元素的索引和值,这里的 index 和 value 不是固定的,读者也可以定义成其它的名字。

  • Hyperledger Composer中的查询以定制的查询语言编写。查询在业务网络定义中的一个叫(queries.qry)的查询文件中定义。 查询语法 所有查询都必须包含description和statement属性。 描述 该description属性是描述查询功能的字符串。它必须包含但可以包含任何东西。 声明 该statement属性包含查询的定义规则,可以具有以下运算符: SELECT 是

  • 主要内容:语法,实例SQLite 的 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。 有可能出现一种情况,在一个表中有多个重复的记录。当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。 语法 用于消除重复记录的 DISTINCT 关键字的基本语法如下: 实例 假设 COMPANY 表有以下记录: 首先,让我们来

  • 在JMeter JSR233元素中,语言组合框中有一个编辑选项,

  • Lucene查询语言 ElasticSearch提供的一些查询方式(query types)能够被Lucene的查询解析器(query parser)语法所支持。由于这个原因,我们来深入学习Lucene查询语言,了解其庐山真面目吧。 基础语法 用户使用Lucene进行查询操作时,输入的查询语句会被分解成一个或者多个Term以及逻辑运算符号。一个Term,在Lucene中可以是一个词,也可以是一个短

  • 嗨,我在我的android应用程序中有一个图标字体,为此我定义了一些这样的字符串 但lint指出了错误“MissingTranslation” 我应该在哪里存储这些独立于语言的字符串?