2013-08-12 3 views
0

QRect를 Sqlite 데이터베이스에 저장해야합니다. 는 (내가 주변에 검색 한하지만 아무것도 보지 않았다)QRect를 Sqlite에 저장하는 방법은 무엇입니까?

합니까 Qt는/QSQLITE 자동으로 QVariant에 QRect를 변환하고 필요한 어떤 분해 처리하거나 내가이 나 자신을하고 기원과 크기 값을 저장해야합니까 4 개의 별도 필드에서? 그렇다면

및 기타 Qt는 데이터 형식이 일반화하기 위해서는 QVector, QList를 저장하는 것이 가능하다? 이 테이블 (및 QRect 등)을 테이블 정의에서 BLOB 타입으로 정의 할 수 있습니까?

+0

로 직렬화 할 수 있습니다 (멤버는 메모리에서 순차적입니다) 문자열로 DB에 저장 한 다음 빠른 바이너리 "초기화"를 수행하기 위해 rect의 메모리 주소로 문자열을 다시 복사하십시오. – dtech

답변

4

SQLite는 관계형 데이터베이스이며, 그 일을 직접 C++ 객체를 저장할 수 없습니다.

은 실제로 C++ 객체 모델은 완전히 투명한 지속성을 허용하지 않습니다하지만 당신은 특수 도구 또는 라이브러리를 사용하여 어느 정도 가까이 시도 할 수 있습니다. 그러나 중요한 점은 객체 자체가 지속성을 지원하도록 설계되어야한다는 것입니다.

투명한 지속성이 필요하지 않지만 개체의 명시 적 저장/검색 만 필요한 경우 원하는 직렬화 방법 (예 : 단일 문자열 사용, 속성에 별도 필드 사용)을 선택할 수 있습니다. 각 방법에는 데이터베이스로 수행하려는 작업 (예 : 수행 할 검색 또는 업데이트의 종류)에 따라 장단점이 있습니다. 또한 C에 대한 불행한 일이다

뭔가 ++의 메타 프로그래밍 능력이 매우 (C보다는 조금 더 나은) 가난하고 예를 들어 반성이 불가능위한 것입니다.

즉, 지원해야 할 각 클래스에 대해 serialization 코드를 작성해야하거나 클래스 정의 .h이 필요한 코드를 생성하는 외부 도구를 찾고/구입해야합니다. 직렬화는 템플릿 메타 프로그래밍의 제한된 범위 밖에있는 것이므로 외부 도구 여야합니다. 예를 QRect가 직렬화 및 T 경우 QList<T>가 직렬화를 위해 :

Qt는 자체가 이미 당신이 찾고있는 것을 위해 그것을 사용할 수있을 수 있으므로 일부 전문 직렬화 기계 QDataStream 있습니다. QByteArray 첫째로 직렬화하고 SQLite는 내부의 덩어리를 저장하기 위해 필요로하는 사용

.예를 들어

template<typename T> 
QByteArray serialize(const T& x) 
{ 
    QByteArray ba; 
    QDataStream s(&ba, QIODevice::WriteOnly); 
    s << x; 
    return ba; 
} 

template<typename T> 
T deserialize(QByteArray& ba) 
{ 
    QDataStream s(&ba, QIODevice::ReadOnly); 
    T res; s >> res; 
    return res; 
} 

를 작성 후, 당신은

QByteArray ba = serialize(x); 

QByteArray에 직접 객체를 직렬화 할 수 있으며, 내가하는 구형의 원시 바이트를 읽을 줄

X x = deserialize<X>(ba); 
+0

감사합니다. 저는 Qt를 처음 사용하고 있으며 이러한 유형의 req를위한 내장 변환 방법이있는 iOS 용 Objective-C로 작업 해 왔습니다. (예 : NSStringFromCGRect','CGRectFromString') 및 데이터베이스 저장을위한 NSManagedObjects. Qt에서 이와 같은 것을 보지 못했습니다. –

+0

@TOMATO : Qt가 기계를 직렬화하면 두 개의 템플릿을 작성하여 비슷한 것을 얻을 수 있습니다. 하나의 직렬화 가능 객체 인스턴스 (예 :'QList ')는'QByteArray'를 제공하고 또 다른 것은'QByteArray' 유형은 인스턴스를 다시 제공합니다. 편집을 참조하십시오. – 6502

+0

감사합니다. 감사합니다! –

0

아니요, 직접 처리해야합니다. QRect를 Sqlite에 저장하는 방법은 귀하와 귀하의 요구 사항에 달려 있습니다. 개별 값을 저장하여 QDataStream을 사용하여 TEXT, BLOB 또는 기타 형식으로 전체 데이터 유형을 직렬화합니다.

1

당신은 열로 id, x, y, h, w (예를 들어)해야합니다 다른 테이블에 QRect를 저장할 수 있습니다.

QRect을 저장하려면 새로 만든 테이블에 새 행을 만들고 id을 가져 와서 대상 테이블에 저장하십시오.

QVectorQList은 컨테이너이며, QRect은 간단한 구조체입니다. 별도의 테이블 (각 항목마다 하나의 행)에 저장하거나 serialize 컨테이너로 BLOB 열 내에 저장할 수 있습니다.