Метод @Insert базы данных Android Room возвращает идентификатор строки, начиная с 0Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Метод @Insert базы данных Android Room возвращает идентификатор строки, начиная с 0

Сообщение Anonymous »

Я реализовал архитектуру MVVM в своем приложении. У меня есть классы активности, модели представления, репозитория, DAO и базы данных. В базе данных хранятся объекты, содержащие разные списки, между которыми я хочу переключаться, и чтобы мой RecyclerView показывал текущий выбранный список. Насколько я понимаю, идентификаторы строк в SQLite начинаются с 1, но метод вставки в моем репозитории (который вызывает метод @Insert в моем DAO) всегда начинается с идентификатора строки, равного 0. В целях тестирования я использую LiveData для получения всех объектов в базе данных, и когда я регистрирую их идентификаторы, они правильно начинаются с 1 и доходят до n. Я не хочу хранить в памяти список всех объектов базы данных, а только один объект, содержащий текущий выбранный список.
Когда пользователь создает новый список (или выбирает существующий список), я хочу, чтобы мой RecyclerView отображал его содержимое и наблюдал за любыми изменениями в этом списке. Я не могу начать наблюдение за объектом без соответствующего идентификатора.
Как передать правильный идентификатор в MainActivity? Если необходимы моя ViewModel и код активности, сообщите мне, и я отредактирую сообщение.
Когда я регистрирую идентификатор из репозитория
Изображение

Когда я регистрирую LiveData в MainActivity отображаются соответствующие идентификаторы.
Изображение

Класс "Моя база данных"
@TypeConverters({ArrayListConverter.class}) // List converter for database
@Database(entities = ListContainer.class, version = 1, exportSchema = false)
public abstract class ListContainerDatabase extends RoomDatabase {

private static ListContainerDatabase dbInstance;
private static final String DB_NAME = "list_container_db";
private static final int NUM_THREADS = 4;

final static ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);

public abstract ListContainerDao getDao();

public static synchronized ListContainerDatabase getInstance(Context context) {
if(dbInstance == null) {
dbInstance = Room.databaseBuilder(
context.getApplicationContext(),
ListContainerDatabase.class, DB_NAME)
.fallbackToDestructiveMigration()
.build();
}
return dbInstance;
}

public static Executor getExecutor() {
return executor;
}

Мой DAO
@Dao
public interface ListContainerDao {

@Insert
long insertListContainer(ListContainer container);

... // other database queries

}

Мой репозиторий
public class Repository {

private static final String TAG = "Repository";

private ListContainerDao listContainerDao;
private long id;

private Executor executor = ListContainerDatabase.getExecutor();

public Repository(Application application) {
ListContainerDatabase containerDb = ListContainerDatabase.getInstance(application);
listContainerDao = containerDb.getDao();
}

public long insertListContainer(ListContainer container) {
executor.execute(new Runnable() {
@Override
public void run() {
id = listContainerDao.insertListContainer(container); // this returns ID starting at 0
}
});
Log.i(TAG, "insertListContainer: from Repository id is :" + id);
return id;
}
}


Подробнее здесь: https://stackoverflow.com/questions/647 ... rting-at-0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»