web-dev-qa-db-ja.com

Android Room TypeConvertersが認識されません

日付を永続化するためにDateConverterを実装しようとしています。それはかなり一般的ですが、私は次々と取得しました:

このフィールドをデータベースに保存する方法がわかりません。型コンバーターを追加することを検討できます。

データベースレベルとフィールドレベルの両方でアノテーションを定義して再確認しましたが、フィールドにタイプコンバーターが定義されていることを解決できません。

私の成績ファイルの依存関係:

compile('Android.Arch.persistence.room:runtime:1.0.0-alpha3') {
    exclude group: 'com.google.code.gson'
}
compile('Android.Arch.persistence.room:rxjava2:1.0.0-alpha3') {
    exclude group: 'com.google.code.gson'
}
testCompile('Android.Arch.persistence.room:testing:1.0.0-alpha3') {
    exclude group: 'com.google.code.gson'
}
annotationProcessor('Android.Arch.persistence.room:compiler:1.0.0-alpha3') {
    exclude group: 'com.google.code.gson'
}

私のAppDatabaseで:

@Database(entities = {Location.class, Room.class, Amenity.class, UserModel.class, EventModel.class}, version =1, exportSchema = false)
@TypeConverters({DateConverter.class})
public abstract class AppDatabase extends RoomDatabase {

    public abstract RoomDao getRoomDao();
    public abstract LocationDao getLocationDao();
    public abstract AmenityDao getAmenityDao();
    public abstract UserDao getUserDao();
    public abstract EventDao getEventDao();

}

次に、私のDateConverterクラスは次のようになります。

public class DateConverter {

    @TypeConverter
    public static Date toDate(Long timestamp) {
        return timestamp == null ? null : new Date(timestamp);
    }

    @TypeConverter
    public static long toTimestamp(Date date) {
        return date == null ? null : date.getTime();
    }
}

私のエンティティは次のようになります:

@Entity(tableName = "event")
@TypeConverters({DateConverter.class})
public class EventModel {

    @PrimaryKey
    private String uuid;

    @ColumnInfo(name = "subject")
    private String subject;

    @TypeConverters({DateConverter.class})
    private Date start;

    @TypeConverters({DateConverter.class})
    private Date end;

    @ColumnInfo(name = "confirmed")
    private Boolean confirmed;

    public String getUuid() {return uuid;}
    public void setUuid(String uuid) {this.uuid = uuid;}

    public String getSubject() {return subject;}
    public void setSubject(String subject) {
        this.subject = subject;
    }

    public Date getStart() {return start;}
    public void setStart(Date date) {this.start = date;}

    public Date getEnd() {return end;}
    public void setEnd (Date end) {
        this.end = end;

    }

    public Boolean getConfirmed() {return confirmed;}

    public void setConfirmed(Boolean confirmed) {
        this.confirmed = confirmed;
    }

}

まだ何か不足していますか?ありがとう!

14
user8290985

Kotlinでの同等の機能は次のとおりです(少なくとも私が使用しているもの)

class DateConverter {
    @TypeConverter
    fun toDate(timestamp: Long?): Date? {
        return when (timestamp) {
            null -> null
            else -> Date(timestamp)
        }
    }

    @TypeConverter
    fun toTimestamp(date: Date?): Long? {
        return date?.time
    }
}

次に、データベースを用意します。

@Database(entities = arrayOf(MyObject::class), version = 1)
@TypeConverters(DateConverter::class)
abstract class MyObjectDb : RoomDatabase() {
    abstract fun myObjectDao(): MyObjectDao
}
5

変更してみてください:

public static long toTimestamp(Date date)

に:

public static Long toTimestamp(Date date)

または、もう一方のパラメータをlongに変更します。 IOW、同じタイプを使用してもらいます。

たとえば、 このサンプルプロジェクト では、次のクラスを使用していますが、正常に機能します。

/***
 Copyright (c) 2017 CommonsWare, LLC
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
 use this file except in compliance with the License. You may obtain    a copy
 of the License at http://www.Apache.org/licenses/LICENSE-2.0. Unless required
 by applicable law or agreed to in writing, software distributed under the
 License is distributed on an "AS IS" BASIS,    WITHOUT WARRANTIES OR CONDITIONS
 OF ANY KIND, either express or implied. See the License for the specific
 language governing permissions and limitations under the License.

 Covered in detail in the book _Android's Architecture Components_
 https://commonsware.com/AndroidArch
 */

package com.commonsware.Android.room;

import Android.Arch.persistence.room.TypeConverter;
import Java.util.Date;

public class TypeTransmogrifier {
  @TypeConverter
  public static Long fromDate(Date date) {
    if (date==null) {
      return(null);
    }

    return(date.getTime());
  }

  @TypeConverter
  public static Date toDate(Long millisSinceEpoch) {
    if (millisSinceEpoch==null) {
      return(null);
    }

    return(new Date(millisSinceEpoch));
  }
}
4
CommonsWare