alloy model에서 쿼리값에 따라 결과값이 다른데 버그인가요?

heroes.fetch({query : "SELECT * FROM hero WHERE selected = " + 100});
통해 결과값 로그를 찍어보면 당연히 selected는 100인값들이 찍힙니다.

그런데
heroes.fetch({query : "SELECT * FROM hero WHERE h_id = " + 62});
이렇게 특정 모델의 값을 찍어보면 위와 같이 100이 찍혀야 하는데 10이 찍힙니다.

초기설정은 10으로 되어있고 클릭했을때 hero.save({ selected : 100 }); 이런식으로 업데이트를 합니다.
idAttribute는 h_id로 설정되어 있는 상황이구여.

혹시나해서 heroes.fetch({ query : “SELECT * FROM hero”}); 를 통해 모든값을 다가져와서 selected를 찍으면 selected가 10으로 모두 찍힙니다.

모두다 차라리 10이 찍히면 업데이트가 제대로 안되었구나라고 판단하겠는데 어떤쿼리에서 결과는 10이고 어떤것은 100이 찍히니까 미치겠네요…ㅠㅠ 그렇다고 중복값이 있는것도 아닙니다. 처음에는 boolean으로 설정을 했는데 혹시 이게 문제인가 싶어서 값을 integer로 바꾸었는데도 해결이 안되는것 같아서 질문드립니다.

테스트겸 로그를 찍었는데
heroes.fetch({query : "SELECT * FROM hero WHERE selected = " + 100 });
Ti.API.info(herose.length); -> 2
heroes.fetch({query : "SELECT * FROM hero WHERE selected = " + 10});
Ti.API.info(heroes.length); -> 124
heroes.fetch({query : “SELECT * FROM hero”});
Ti.API.info(heroes.length); -> 124

이렇게 찍힙니다. 머가 말이 안되는 상황이네요;;;

===수정===
heroes는 컬렉션이고 hero는 모델입니다.

SQLite Sync Adapter 사용하신거죠?

정확히 이해가 안되는데 selected를 모두 100으로 바꿨는데 어떤 모델은 10이고 어떤 모델은 100이라는 말인가요?
그리고 hero는 model인가요? collection 인가요? model이면 length 속성은 없고 collection이면 save 속성이 없는데 설명에는 둘다 있어서 헷갈립니다.

네. 수정했습니다. 124개중에 2개를 100으로 바꾸었는데

  1. heroes.fetch({query : "SELECT * FROM hero WHERE selected = " + 100 });

  2. heroes.fetch({query : "SELECT * FROM hero WHERE selected = " + 10});

  3. heroes.fetch({query : “SELECT * FROM hero”});

1, 2, 3순서로 쿼리를 날려 개수를 확인해보니 2개, 124개, 124개가 나옵니다. 업데이트를 하려고 하니 잘 안되네요.

124개중에 2개가 100이면 10인거는 122개가 나와야하는건데 똑같이 124개가 나와버리네요. ;;

Collection 의 fetch는 기본적으로 add 됩니다. 예전버전의 기본은 reset이였죠. 원하시는 값을 얻으려면 reset 을 true 로 같이 넘겨주세요.

reset을 true로 해도 안되고 http://docs.appcelerator.com/platform/latest/#!/guide/Alloy_Backbone_Migration 여길보고 티타늄 컬렉션에 확장메소드로 넣어도 안되네요. 동일한 모델인데 쿼리방법에 따라 내부값이 달라지는게 너무 이해가 안됩니다.;;;

ti랑 alloy 버전이 어떻게 되는데요??
10 인것만 fetch 먼저하면 몇개나와여?
reset 안되고 add되는것 같은데…

Titanium CLI Version = 3.4.2
Titanium SDKVersion = 3.5.1.GA
Alloy = 1.5.1

모두 최신버전으로 알고있습니다. index.js에서 10인것만 fetch하면 124개가 나옵니다. 그 이후 100개를 패치하면 2개가 나오고 전체를 fetch하면 124개가 나옵니다. 전체 개수는 124개가 맞구여.

이것저것 시도해보고 있는데 시간은 없고 원인도 잘 모르겠네요. 정 안되면 야매로라도 만들어야할듯합니다. ㅠㅠ

이상하군요. 저는 잘됩니다. 혹시 model 선언한 코드 전체를 공유해 줄수 있으면 원인을 알수도 있을 것 같아요.

그리고 sql 아답터 쓸때 주의할 점은 이건 db이다보니 config의 adapter나 colums을 변경할 경우 앱을 삭제후 다시 깔거나 migration으로 해당 부분을 커버해줘야합니다.
모델 파일 생성한 후, idAttribute를 지정하지 않은 채로 앱을 한번 실행했던건 아니신가요? 그 이후에 idAttribute를 지정해도 이게 db에서는 primary key로 동작 안합니다. (이미 만들어진 alloy_id가 key로 동작합니다.)
(그래서 저는 이런 이유로 앱에 데이터를 따로 저장해야할때는 property 아답터를 선호합니다.)

혹시나 해서 아래와 같이 간단히 만든 후에 테스트 해봤는데도 잘되요.

exports.definition = {
	config: {
		columns: {
		    "selected": "int",
		    "h_id": "string"
		},
		adapter: {
			type: "sql",
			collection_name: "car",
			idAttribute : 'h_id'
		}
	},
	extendModel: function(Model) {
		_.extend(Model.prototype, {
			// extended functions and properties go here
		});

		return Model;
	},
	extendCollection: function(Collection) {
		_.extend(Collection.prototype, {
			// extended functions and properties go here
		});

		return Collection;
	}
};

여기 링크랑 비슷한 상황인것 같습니다.
링크: http://stackoverflow.com/questions/20517418/not-able-to-update-model-using-alloy-in-titanium-appcelerator

저장은 잘되는데 업데이트가 안되어서요;;

아래는 hero 모델입니다.

    exports.definition = {
	config: {
		columns: {
		    "h_id": "text",
		    "national": "text",
		    "updateDate": "text",
                "selected": "int"
		},
		adapter: {
			type: "sql",
			collection_name: "hero",
			idAttribute: "h_id"
		}
	},
	extendModel: function(Model) {
		_.extend(Model.prototype, {
			// extended functions and properties go here
		});

		return Model;
	},
	extendCollection: function(Collection) {
		_.extend(Collection.prototype, {
			// extended functions and properties go here
		});

		return Collection;
	}
};

업데이트 했던 방법

var hid = 12;
var q = "SELECT * FROM hero WHERE h_id = " + hid;
var hero = Alloy.Collections.instance('hero');
hero.fetch({	query : q 	});
var h = hero.at(0);
h.save({selected : 100	});

hid로 모델을 컬렉션에 찾아서 selected를 100으로 저장합니다.
그러면 h자체는 저장이 잘되었는데 쿼리를 통해 검색해서 확인하면 업데이트가 안되어있습니다.

해결습니다.;;
모델에 fetch를 주니 해결이 되네요.
머 사실 아직도 잘 이해가 안되지만 일단 해결했으니 완성후 다시 살펴봐야겠습니다.

var hid = 12;
var q = "SELECT * FROM hero WHERE h_id = " + hid;
var hero = Alloy.Collections.instance('hero');
hero.fetch({	query : q 	});
var h = hero.at(0);
h.set({selected : 100	}).save();
h.fetch();

== 추가 ==
idAttribute를 지우니 그냥 잘되네요;;;

언급하신 링크에 보면 나와있는 답변 처럼 idAttribute를 바꿀려면 단순히 adapter에만 지정하는 것이 아니라 colums에서 해당 속성에 PRIMARY KEY라고 지정하고 model에도 idAttribute를 지정해야하는 거 아닐까요?
시간날때 한번 뭐가 문제인지 살펴보고 정말 아답터가 문제라면 수정해서 Pull Request 날려야겠네요. :slight_smile:

exports.definition = {
config: {
    columns: {
        "id": "INTEGER PRIMARY KEY",
        "name": "TEXT",
        "marcado": "INTEGER"
    },
    adapter: {
        type: "sql",
        idAttribute: "id"
    }
},
    extendModel: function(Model) {
    _.extend(Model.prototype, {
        idAttribute: "id",
   ...
        return Model;
    }
};