Использование комнаты для хранения системного журнала - PullRequest
0 голосов
/ 18 февраля 2019

В моем приложении есть небольшой сервис, который создает много журналов.Поскольку эти журналы важны, мне нравится сохранять их локально для последующего использования, хотя я показываю их использование одновременно.Я решил использовать небольшую базу данных для хранения этих журналов.Таким образом, моя служба легко создает эти журналы, а мое приложение показывает эти журналы пользователям.

Мой журнал действительно прост.Давайте предположим, что мои Entity и Dao определены следующим образом:

@Entity(tableName = "logs_db")
public class LogsData {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    private int mId;
    @ColumnInfo(name = "level")
    private int mLevel;
    @NonNull
    @ColumnInfo(name = "desc")
    private String mDesc;

    public LogsData() {
    }

    @Ignore
    public LogsData(int level, @NonNull String desc) {
        mId = 0;
        mLevel = level;
        mDesc = desc;
    }

    public int getId() {
        return mId;
    }

    public void setId(int id) {
        mId = id;
    }

    public int getLevel() {
        return mLevel;
    }

    public void setLevel(int level) {
        mLevel = level;
    }

    public String getDesc() {
        return mDesc;
    }

    public void setDesc(@NonNull String desc) {
        mDesc = desc;
    }
}

@Dao
public interface LogsDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void addLog(LogsData logs);

    @Query("DELETE FROM logs_table")
    void deleteAll();

    @Query("SELECT * FROM logs_table")
    LiveData<List<LogsData>> getAllLogs();
}

Хорошо, теперь вот моя проблема.Предположим, что в моей текущей таблице 100 строк, и я добавляю еще 1 запись в журнале на addLog().getAllLogs() вернет 101 строку журналов, потому что она запрашивает всю таблицу.Итак, использование getAllLogs() - наихудшая идея для чтения журналов из моей таблицы.Потому что для каждой вставки в logs_db я получу все содержимое таблицы , в то время как важны только новые журналы .

Я пытаюсь изменить Doa и / или Entity чтобы найти способ получения только последних добавленных логов.Это означает, что, например, если в таблице 10 строк журнала и добавлено 2 новых, я получу более новую версию 2. Есть идеи, как мне это сделать?

Кстати, если вы считаете эту идеюиспользование Room DB для моих журналов не подходит, я приветствую любые новые предложения.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я понимаю вашу потребность.И библиотека log4j - это именно то, что нужно для этого.Вы можете распечатать журнал в реальном времени, а также сохранить их в файле журнала или базе данных в соответствии с вашими потребностями.

Таким образом, вы можете распечатать журнал как

static Logger log = Logger.getLogger(log4jExample.class.getName());
log.trace("Trace Message!");
log.debug("Debug Message!");
log.info("Info Message!");
log.warn("Warn Message!");
log.error("Error Message!");
log.fatal("Fatal Message!");

Чтобы сохранить журналы в файл или базу данныхвам нужно настроить файл log4j.properties.

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

LogManager ищет файл с именем log4j.properties в CLASSPATH .Поэтому вам нужно поместить этот файл в ваш CLASSPATH .

Ссылка:

  1. Пожалуйста, посмотрите на официальном сайте здесь .

  2. Также здесь базовый учебник для этой библиотеки.

  3. log4j.properties учебник

0 голосов
/ 18 февраля 2019

Я думаю, что нет элегантного способа реализовать это с помощью Room.Однако вы можете установить тип возврата Long для метода, помеченного @Insert аннотацией.

@Insert(onConflict = OnConflictStrategy.REPLACE)
void addLog(LogsData logs): Long; 

После этого вы можете использовать эти идентификаторы для извлечения последних добавленных записей из БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...