Разница в JSONStore между числом и числом в полях поиска

У меня есть вопрос о JSONStore searchFields.

Если я использую number в качестве ключа searchFields и попытаться найти данные по WL.JSONStore.find метод с 0 как запрос, он будет поражать все данные (не фильтруется).

С integer из вышеприведенного случая работает нормально.

В чем разница между number а также integer?

2 ответа

Решение

JSONStore использует SQLite для сохранения данных, о типах данных SQLite вы можете прочитать здесь. Краткий ответ: 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

(Файл андроида должен быть под /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 обратные вызовы для краткости.

Фактическая разница между числом JSON и целым числом

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

Надеюсь, вы понимаете

Другие вопросы по тегам