JSONStore在searchFields中'number'和'integer'之间的区别

时间:2013-03-15 01:08:55

标签: ibm-mobilefirst jsonstore

我对JSONStore searchFields有疑问。

如果我使用number作为searchFields键并尝试使用WL.JSONStore.find方法查找数据并使用0作为查询,则会点击所有数据(未过滤)。

使用上述案例的integer可以正常工作。

numberinteger之间有什么区别?

2 个答案:

答案 0 :(得分:4)

JSONStore使用SQLite来保存数据,您可以阅读有关SQLite数据类型here的信息。简短回答是number将数据存储为REAL,而integer将数据存储为INTEGER

如果您创建一个名为nums的集合,其中一个名为num的搜索字段number

var nums = WL.JSONStore.initCollection('nums', {num: 'number'}, {});

并添加一些数据:

var len = 5;
while (len--) {
    nums.add({num: len});
}

然后使用查询find

致电{num: 0}
nums.find({num: 0}, {onSuccess: function (res) {
    console.log(JSON.stringify(res));
}})

你应该回来:

[{"_id":1,"json":{"num":4}},{"_id":2,"json":{"num":3}},{"_id":3,"json":{"num":2}},{"_id":4,"json":{"num":1}},{"_id":5,"json":{"num":0}}]

请注意,您已收回所有存储的文件(num = 4,3,2,1,0)。

如果查看.sqlite文件:

$ cd ~/Library/Application Support/iPhone Simulator/6.1/Applications/[id]/Documents
$ sqlite3 jsonstore.sqlite

(android文件应位于/data/data/com.[app-name]/databases/

sqlite> .schema
CREATE TABLE nums ( _id INTEGER primary key autoincrement,  'num' REAL, json BLOB, _dirty REAL default 0, _deleted INTEGER default 0, _operation TEXT);

请注意num的数据类型为REAL

运行查询与查找函数中使用的查询相同:

sqlite> SELECT * FROM nums WHERE num LIKE '%0%';
1|4.0|{"num":4}|1363326259.80431|0|add
2|3.0|{"num":3}|1363326259.80748|0|add
3|2.0|{"num":2}|1363326259.81|0|add
4|1.0|{"num":1}|1363326259.81289|0|add
5|0.0|{"num":0}|1363326259.81519|0|add

注意4存储为4.0,JSONStore的查询始终使用LIKE,任何带0的数字都将与查询匹配。

如果您改为使用integer

var nums = WL.JSONStore.initCollection('nums', {num: 'integer'}, {});

查找退货:

[{"_id":5,"json":{"num":0}}]

schema表示num具有INTEGER数据类型:

sqlite> .schema
CREATE TABLE nums ( _id INTEGER primary key autoincrement,  'num' INTEGER, json BLOB, _dirty REAL default 0, _deleted INTEGER default 0, _operation TEXT);

sqlite> SELECT * FROM nums WHERE num LIKE '%0%';
5|0|{"num":0}|1363326923.44466|0|add

为简洁起见,我跳过了部分onSuccess和所有onFailure回调。

答案 1 :(得分:1)

JSON数和整数之间的实际差异是

defining {age: 'number'} indexes 1 as 1.0,
while defining{age: 'integer'} indexes 1 as 1.

希望你理解