2

私は ormlite を使用しており、フィールドを持つデータベースがあります。

public static final String NAME = "name"; 
@DatabaseField (canBeNull = false, dataType = DataType.SERIALIZABLE, columnName = NAME)
private String[] name = new String[2];

そして、name[0] と name[1] が「車」であるすべての要素を取得したいと思います。次のような where 句を追加しようとしています。

NAMEDB nameDB = null;
Dao<NAMEDB, Integer> daoName = this.getHelper().getDao(NAMEDB.class);
QueryBuilder<NAMEDB, Integer> queryName = daoName.queryBuilder();
Where<NAMEDB, Integer> where = queryName.where();
where.in(nameDb.NAME, "car");

しかし、配列文字列なので機能しません。

私は他のフィールドを持っています:

public static final String MARK = "mark";

@DatabaseField (canBeNull = false, foreign = true, index = true, columnName = MARK)
private String mark = null;

そして、私はこれを行うことができます:

whereArticulo.in(nameDB.MARK, "aaa");

どうすれば問題を解決できますか? ありがとう。

4

3 に答える 3

4

String[] someStringArray[]データベースに文字列配列 ( )を格納するための 3 番目のオプションは、データベースOrmliteへの格納時に文字列配列を 1 つの区切り文字列に変換し、その後文字列配列に戻すデータ永続化クラスを定義することです。データベースから取り出します。

たとえば、永続化クラスはデータベース ストレージ用に変換["John Doe", "Joe Smith"]"John Doe | Joe Smith"れ (データに適した区切り文字を使用)、データベースからデータを取り出すときに逆に変換されます。

Serializable または外部コレクションを使用する場合と比較して、このアプローチについて何か考えはありますか? 誰もこれを試しましたか?

最初の永続化クラスを作成したばかりで、非常に簡単でした。誰かがこれを試したことを Web 検索または StackOverflow 検索で特定できませんでした。

ありがとう。

于 2013-02-14T14:06:58.503 に答える
2

ronbo4610 が提案したように、この場合、カスタム データ パーシスタを使用して、配列を何らかの区切り文字で区切られた文字列としてデータベースに格納することをお勧めします。その後、他の文字列と同じように、WHERE 句で文字列を検索できます。(たとえば、LIKE 演算子を使用)

私はそのようなデータ永続化を実装しました。これを使用するには、永続クラスの String[] オブジェクトの上に次の注釈を追加する必要があります。

@DatabaseField(persisterClass = ArrayPersister.class)

さらに、次のコードを使用して「ArrayPersister」という新しいクラスを作成する必要があります。

import com.j256.ormlite.field.FieldType;
import com.j256.ormlite.field.SqlType;
import com.j256.ormlite.field.types.StringType;
import org.apache.commons.lang3.StringUtils;

public class ArrayPersister extends StringType {
    private static final String delimiter = ",";
    private static final ArrayPersister singleTon = new ArrayPersister();

    private ArrayPersister() {
        super(SqlType.STRING, new Class<?>[]{ String[].class });
    }

    public static ArrayPersister getSingleton() {
        return singleTon;
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object javaObject) {
        String[] array = (String[]) javaObject;

        if (array == null) {
            return null;
        }
        else {
            return StringUtils.join(array, delimiter);
        }
    }

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) {
        String string = (String)sqlArg;

        if (string == null) {
            return null;
        }
        else {
            return string.split(delimiter);
        }
    }
}
于 2013-09-07T18:17:03.337 に答える
1

残念ながら、ORMLiteはtype であるフィールドのクエリをサポートしていませSERIALIZABLE。配列をシリアル化されたものとして保存しているため、次のようなクエリbyte[]で値に対してクエリを実行することはできません。IN

where.in(nameDb.NAME, "car");

ORMLite は外部コレクションをサポートしていますが、名前を保持する別のクラスで自分で設定する必要があります。サンプル コードを含むドキュメントを参照してください。

http://ormlite.com/docs/foreign-collection

于 2012-06-04T14:08:41.623 に答える