Вопросы по тегу: android-room

(14)

Как обновить LiveData ViewModel из фоновой службы и интерфейса обновления

Недавно я изучаю архитектуру Android, недавно представленную Google. Из Документации я нашел это:public class MyViewModel extends ViewModel { private MutableLiveData> users; public LiveData> getUsers() { if (users == null) { users = new MutableLiveData>(); loadUsers(); } return users; } private void loadUsers() { // do async operation to fetch users } } действие может получить доступ к этому списку следующим образом:public class MyActivity extends AppCompatActivity { public void onCreate(Bundle savedInstanceState) { MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class); model.getUsers().observe(this, users -> { // update UI }); } } Мой вопрос: я собираюсь сделать это: в функции loadUsers() я извлекаю данные асинхронно, где я сначала проверю базу данных (комнату) на наличие этих данных Если я не получу туда данные, я вызову API для получения данных с веб-сервера. Я вставлю полученные данные в базу данных (Комната) и обновлю пользовательский интерфейс в соответствии с данными. Какой рекомендуемый подход для этого?Если я запускаю Service для вызова API из метода loadUsers(), как мне обновить MutableLiveData> пользователейпеременная из этого Service?
S

S Haque

5 лет назад

Ответов: 5

Android Room: вставка объектов отношений с помощью Room

Я добавил связь "один ко многим" в Room, используя Relation. Я сослался на этот пост, чтобы написать следующий код для отношения в комнате.В сообщении рассказывается, как считывать значения из базы данных, но сохранение объектов в базе данных привело к тому, что userId было пустым, что означает отсутствие связи между двумя таблицами.Я не уверен, как лучше всего вставить пользователя и список домашних животных в базу данных, имея userId*100009 * значение.1) Объект пользователя:@Entity public class User { @PrimaryKey public int id; // User id } 2) Домашнее животное:@Entity public class Pet { @PrimaryKey public int id; // Pet id public int userId; // User id public String name; } 3) UserWithPets POJO:// Note: No annotation required at this class definition. public class UserWithPets { @Embedded public User user; @Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class) public List pets; } Теперь для извлечения записей из БД мы используем следующее DAO:@Dao public interface UserDao { @Insert fun insertUser(user: User) @Query("SELECT * FROM User") public List loadUsersWithPets(); } РЕДАКТИРОВАТЬЯ создал эту проблему https://issuetracker.google.com/issues/62848977 в системе отслеживания проблем. Надеюсь, они что-нибудь с этим сделают.
A

Akshay Chordiya

5 лет назад

Ответов: 6

Постоянство комнаты: ошибка: сущности и Pojos должны иметь пригодный для использования общедоступный конструктор

Я конвертирую проект в Kotlin и пытаюсь сделать свою модель (которая также является моей сущностью) классом данных Я намерен использовать Moshi для преобразования ответов JSON из API@Entity(tableName = "movies") data class MovieKt( @PrimaryKey var id : Int, var title: String, var overview: String, var poster_path: String, var backdrop_path: String, var release_date: String, var vote_average: Double, var isFavorite: Int ) Я не могу собрать приложение из-за следующей ошибки Сущности и Pojos должны иметь общедоступный конструктор. У вас может быть пустой конструктор или конструктор, параметры которого соответствуют полям (по имени и типу). Не удается найти сеттер для поля. Примеры, которые я нашел, недалеко от этогоЕсть идеи, как это решить?
L

Leonardo Deleon

5 лет назад

Ответов: 30

Android Room Database: How to handle Arraylist in an Entity?

I just implemented Room for offline data saving. But in an Entity class, I am getting the following error: Error:(27, 30) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. And the class is as following: @Entity(tableName = "firstPageData") public class MainActivityData { @PrimaryKey private String userId; @ColumnInfo(name = "item1_id") private String itemOneId; @ColumnInfo(name = "item2_id") private String itemTwoId; // THIS IS CAUSING THE ERROR... BASICALLY IT ISN'T READING ARRAYS @ColumnInfo(name = "mylist_array") private ArrayList myListItems; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public ArrayList getMyListItems() { return myListItems; } public void setCheckListItems(ArrayList myListItems) { this.myListItems = myListItems; } } So basically I want to save the ArrayList in the database but I was not able to find anything relevant to it. Can you guide me regarding how to save an Array using Room? NOTE: MyListItems Pojo class contains 2 Strings (as of now) Thanks in advance.
T

Tushar Gogna

5 лет назад

Ответов: 19

Android room persistent: AppDatabase_Impl does not exist

My app database class@Database(entities = {Detail.class}, version = Constant.DATABASE_VERSION) public abstract class AppDatabase extends RoomDatabase { private static AppDatabase INSTANCE; public abstract FavoritesDao favoritesDao(); public static AppDatabase getAppDatabase(Context context) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build(); //Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build(); } return INSTANCE; } public static void destroyInstance() { INSTANCE = null; } } Gradle lib: compile "android.arch.persistence.room:runtime:+" annotationProcessor "android.arch.persistence.room:compiler:+" And when i ask for instance it will give this error, AppDatabase_Impl does not exist in my application class public class APp extends Application { private boolean appRunning = false; @Override public void onCreate() { super.onCreate(); AppDatabase.getAppDatabase(this); //--AppDatabase_Impl does not exist } }
p

pratik deshai

4 года назад

Ответов: 24

Android Room - выберите запрос с LIKE

Я пытаюсь сделать запрос для поиска всех объектов, имена которых содержат текст:@Query("SELECT * FROM hamster WHERE name LIKE %:arg0%") fun loadHamsters(search: String?): Flowable> Сообщения:Error:no viable alternative at input 'SELECT * FROM hamster WHERE name LIKE %' Error:There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (near "%": syntax error) Error:Unused parameter: arg0 Тоже пробую:@Query("SELECT * FROM hamster WHERE name LIKE '%:arg0%'") fun loadHamsters(search: String?): Flowable> Сообщения:Error:Unused parameter: arg0 Как исправить?
D

Denis Buzmakov

5 лет назад

Ответов: 4

Перенос базы данных комнаты, если добавлена ​​только новая таблица

Допустим, у меня простая база данных Room:@Database(entities = {User.class}, version = 1) abstract class AppDatabase extends RoomDatabase { public abstract Dao getDao(); } Теперь я добавляю новую сущность: Pet и увеличиваю версию до 2:@Database(entities = {User.class, Pet.class}, version = 2) abstract class AppDatabase extends RoomDatabase { public abstract Dao getDao(); } Конечно, Room выдает исключение: java.lang.IllegalStateException: необходим переход с 1 на 2.Предполагая, что я не изменил класс User (так что все данные в безопасности), я должен предоставить миграцию, которая просто создает новую таблицу. Итак, я просматриваю классы, созданные Room, ищу сгенерированный запрос для создания моей новой таблицы, копирую ее и вставляю в миграцию:final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(@NonNull final SupportSQLiteDatabase database) { database.execSQL("CREATE TABLE IF NOT EXISTS `Pet` (`name` TEXT NOT NULL, PRIMARY KEY(`name`))"); } }; Однако мне неудобно делать это вручную. Есть ли способ сообщить Room: Я не касаюсь ни одной из существующих таблиц, поэтому данные в безопасности. Создайте для меня миграцию?
P

Piotr Aleksander Chmielowski

4 года назад

Ответов: 7

Просмотр содержимого базы данных, созданной с помощью библиотеки сохранения состояния комнаты

Есть ли более простой способ просмотреть содержимое базы данных, созданной с помощью библиотеки Room Persistence Library в Android Studio?
S

SpiralDev

5 лет назад

Ответов: 19

Android Room - простой запрос выбора - нет доступа к базе данных в основном потоке

Я пробую образец с Библиотекой сохраняемости комнаты. Я создал объект:@Entity public class Agent { @PrimaryKey public String guid; public String name; public String email; public String password; public String phone; public String licence; } Создан класс DAO:@Dao public interface AgentDao { @Query("SELECT COUNT(*) FROM Agent where email = :email OR phone = :phone OR licence = :licence") int agentsCount(String email, String phone, String licence); @Insert void insertAgent(Agent agent); } Создан класс базы данных:@Database(entities = {Agent.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract AgentDao agentDao(); } Открытая база данных с использованием подкласса ниже в Котлине:class MyApp : Application() { companion object DatabaseSetup { var database: AppDatabase? = null } override fun onCreate() { super.onCreate() MyApp.database = Room.databaseBuilder(this, AppDatabase::class.java, "MyDatabase").build() } } В моей деятельности реализована функция ниже:void signUpAction(View view) { String email = editTextEmail.getText().toString(); String phone = editTextPhone.getText().toString(); String license = editTextLicence.getText().toString(); AgentDao agentDao = MyApp.DatabaseSetup.getDatabase().agentDao(); //1: Check if agent already exists int agentsCount = agentDao.agentsCount(email, phone, license); if (agentsCount > 0) { //2: If it already exists then prompt user Toast.makeText(this, "Agent already exists!", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Agent does not exist! Hurray :)", Toast.LENGTH_LONG).show(); onBackPressed(); } } К сожалению, при выполнении вышеуказанного метода происходит сбой с трассировкой стека ниже: FATAL EXCEPTION: main Process: com.example.me.MyApp, PID: 31592 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:5612) at android.view.View$PerformClick.run(View.java:22288) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:5612) at android.view.View$PerformClick.run(View.java:22288) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long periods of time. at android.arch.persistence.room.RoomDatabase.assertNotMainThread(RoomDatabase.java:137) at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:165) at com.example.me.MyApp.RoomDb.Dao.AgentDao_Impl.agentsCount(AgentDao_Impl.java:94) at com.example.me.MyApp.View.SignUpActivity.signUpAction(SignUpActivity.java:58) at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:5612) at android.view.View$PerformClick.run(View.java:22288) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Похоже, эта проблема связана с выполнением операции db в основном потоке. Однако пример кода теста, приведенный в приведенной выше ссылке, не запускается в отдельном потоке:@Test public void writeUserAndReadInList() throws Exception { User user = TestUtil.createUser(3); user.setName("george"); mUserDao.insert(user); List byName = mUserDao.findUsersByName("george"); assertThat(byName.get(0), equalTo(user)); } Я что-нибудь здесь упустил? Как я могу заставить его работать без сбоев? Пожалуйста, предложите.
D

Devarshi

5 лет назад

Ответов: 21

Update some specific field of an entity in android Room

I am using android room persistence library for my new project. I want to update some field of table. I have tried like in my Dao -// Method 1: @Dao public interface TourDao { @Update int updateTour(Tour tour); } But when I try to update using this method then it updates every field of the entity where it matches primary key value of tour object. I have used @Query// Method 2: @Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid") int updateTour(long tid, String end_address); It is working but there will be many queries in my case because I have many fields in my entity. I want to know how can I update some field (not all) like Method 1 where id = 1; (id is the auto generate primary key).// Entity: @Entity public class Tour { @PrimaryKey(autoGenerate = true) public long id; private String startAddress; private String endAddress; //constructor, getter and setter }
R

Rasel

4 года назад

Ответов: 9

Как избавиться от предупреждения о запросе инкрементальной обработки аннотаций?

Я только начал использовать Android-разработку и пытаюсь использовать библиотеку Room. Со вчерашнего дня я получаю это предупреждение w: [kapt] Запрошена инкрементная обработка аннотаций, но поддержка есть отключено, поскольку следующие процессоры не являются инкрементными: androidx.lifecycle.LifecycleProcessor (NON_INCREMENTAL), androidx.room.RoomProcessor (NON_INCREMENTAL). Я пытался исследовать и исправить, но не смог избежать этой ошибки, вот мой файл grale.build. пожалуйста, предложите / посоветуйте, что я делаю не так.apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "ps.room.bookkeeper" minSdkVersion 15 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation":"$projectDir/schemas".toString()] } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.core:core-ktx:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.google.android.material:material:1.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' // life cycle dependencies def lifecycle_version = "2.0.0" implementation "android.arch.lifecycle:extensions:$lifecycle_version" kapt "android.arch.lifecycle:compiler:$lifecycle_version" //Room dependencies //def room_version = "2.1.0" implementation 'android.arch.persistence.room:runtime:2.1.0' kapt 'android.arch.persistence.room:compiler:2.1.0' //annotationProcessor 'android.arch.persistence.room:compiler:2.1.0' // implementation "android.arch.lifecycle:extensions:$room_version" // kapt "android.arch.persistence.room:compiler:$room_version" // androidTestImplementation "android.arch.persistence.room:testing:$room_version" //implementation 'androidx.room:room-runtime:2.1.0' //annotationProcessor 'androidx.room:room-compiler:2.1.0' }
S

Shax

2 года назад

Ответов: 14

Android Room - Получите идентификатор новой вставленной строки с помощью автоматического создания

Вот как я вставляю данные в базу данных с помощью библиотеки сохранения состояния комнаты:Объект:@Entity class User { @PrimaryKey(autoGenerate = true) public int id; //... } Объект доступа к данным:@Dao public interface UserDao{ @Insert(onConflict = IGNORE) void insertUser(User user); //... } Можно ли вернуть идентификатор пользователя после завершения вставки в самом вышеуказанном методе без написания отдельного запроса выбора?
S

SpiralDev

5 лет назад

Ответов: 7

Комната - каталог экспорта схемы не предоставляется обработчику аннотаций, поэтому мы не можем экспортировать схему.

Я использую комнату компонентов базы данных AndroidЯ все настроил, но при компиляции Android Studio выдает предупреждение: Каталог экспорта схемы не предоставляется обработчику аннотаций, поэтому мы не можем экспортировать схему. Вы можете либо предоставить room.schemaLocation аргумент обработчика аннотаций ИЛИ установить exportSchema в false. Насколько я понимаю, это место, где будет находиться файл БДКак это может повлиять на мое приложение? Какая здесь лучшая практика? Следует ли использовать расположение по умолчанию (false значение)?
M

Misha Akopov

5 лет назад

Ответов: 8

Библиотека постоянства номеров. Удалить все

Как удалить все записи в определенной таблице с помощью библиотеки Room Persistence Library? Мне нужно удалить таблицу, но я не могу найти никакой информации о том, как это сделать.Особенно при миграции базы данных или для загрузки всех записей и их удаления :)
S

Sirelon

5 лет назад

2022 WebDevInsider