คำถามติดแท็ก android-room

สำหรับคำถามที่เกี่ยวข้องกับ Android Room Persistence Library (ซึ่งเป็นส่วนหนึ่งของ Android Architecture Components)

7
Room - ไดเร็กทอรีการเอ็กซ์พอร์ต Schema ไม่ได้ถูกจัดเตรียมไว้ในตัวประมวลผลหมายเหตุประกอบดังนั้นเราไม่สามารถเอ็กซ์พอร์ตสกีมา
ฉันใช้ห้องส่วนประกอบฐานข้อมูล Android ฉันได้กำหนดค่าทุกอย่างแล้ว แต่เมื่อฉันคอมไพล์ Android Studio ให้คำเตือนนี้กับฉัน: ไดเร็กทอรีการส่งออกสคีมาไม่ได้ถูกจัดเตรียมไว้ในตัวประมวลผลคำอธิบายประกอบดังนั้นเราจึงไม่สามารถส่งออกสคีมาได้ คุณสามารถระบุ room.schemaLocationอาร์กิวเมนต์ตัวประมวลผลคำอธิบายประกอบหรือตั้งค่า exportSchema เป็นเท็จ เพราะฉันเข้าใจว่ามันเป็นที่ตั้งของไฟล์ฐานข้อมูล มันจะส่งผลกระทบต่อแอพของฉันได้อย่างไร การปฏิบัติที่ดีที่สุดที่นี่คืออะไร? ฉันควรใช้ตำแหน่งเริ่มต้น ( falseค่า) หรือไม่

6
วิธีการสร้างคีย์หลักเป็น autoincrement สำหรับห้องพักการคงอยู่ lib
ฉันกำลังสร้างอาหารคลาส Entity (Room Persistence lib) ที่ฉันต้องการทำเป็นfoodIdautoincrement @Entity class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double) { @PrimaryKey var foodId: Int = 0 var calories: Double = 0.toDouble() } ฉันจะตั้งfoodIdค่าฟิลด์การสร้างอัตโนมัติได้อย่างไร

8
ห้องสมุดห้องติดตา ลบทั้งหมด
ฉันจะลบรายการทั้งหมดบนตารางที่ระบุโดยใช้ห้องสมุดการคงอยู่ของห้องได้อย่างไร ฉันต้องการวางตาราง แต่ไม่สามารถหาข้อมูลใด ๆ ได้ เมื่อฐานข้อมูลกำลังโยกย้ายหรือโหลดรายการทั้งหมดและลบออก :)

12
วิธีการกำจัดการประมวลผลคำอธิบายประกอบที่เพิ่มขึ้นได้รับการร้องขอคำเตือน?
ฉันเพิ่งเริ่มต้นใช้การพัฒนาแอนดรอยด์และพยายามใช้ห้องสมุดห้อง ตั้งแต่เมื่อวานฉันกำลังเผชิญกับข้อความเตือนนี้ 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 …

20
ห้อง Android ถาวร: AppDatabase_Impl ไม่มีอยู่
คลาสฐานข้อมูลแอปของฉัน @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 = …

7
Android Room - รับรหัสของแถวที่แทรกใหม่พร้อมการสร้างอัตโนมัติ
นี่คือวิธีที่ฉันแทรกข้อมูลลงในฐานข้อมูลโดยใช้ Room Persistence Library: Entity: @Entity class User { @PrimaryKey(autoGenerate = true) public int id; //... } วัตถุการเข้าถึงข้อมูล: @Dao public interface UserDao{ @Insert(onConflict = IGNORE) void insertUser(User user); //... } เป็นไปได้ไหมที่จะส่งคืน id ของผู้ใช้เมื่อการแทรกเสร็จสมบูรณ์ในวิธีการข้างต้นโดยไม่ต้องเขียนข้อความค้นหาแยกต่างหาก

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") …

6
อัปเดตฟิลด์เฉพาะของเอนทิตีในห้อง Android
ฉันใช้ไลบรารีคงอยู่ของห้อง Android สำหรับโปรเจ็กต์ใหม่ของฉัน ฉันต้องการอัปเดตฟิลด์ของตาราง ฉันได้ลองเหมือนในDao- // Method 1: @Dao public interface TourDao { @Update int updateTour(Tour tour); } แต่เมื่อฉันพยายามอัปเดตโดยใช้วิธีนี้มันจะอัปเดตทุกฟิลด์ของเอนทิตีที่ตรงกับค่าคีย์หลักของอ็อบเจ็กต์ทัวร์ ฉันได้ใช้@Query // Method 2: @Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid") int updateTour(long tid, String end_address); มันใช้งานได้ แต่จะมีคำถามมากมายในกรณีของฉันเนื่องจากฉันมีหลายฟิลด์ในเอนทิตีของฉัน ฉันต้องการทราบว่าฉันจะอัปเดตฟิลด์บางฟิลด์ (ไม่ใช่ทั้งหมด) เช่นMethod 1โดยที่ id = 1; (id คือคีย์หลักที่สร้างโดยอัตโนมัติ) // …

3
ห้อง Android - เลือกข้อความค้นหาด้วย LIKE
ฉันกำลังพยายามสร้างคำค้นหาเพื่อค้นหาวัตถุทั้งหมดที่มีชื่อประกอบด้วยข้อความ: @Query("SELECT * FROM hamster WHERE name LIKE %:arg0%") fun loadHamsters(search: String?): Flowable<List<Hamster>> ข้อความ: 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 * …

6
การย้ายฐานข้อมูลห้องหากมีการเพิ่มตารางใหม่เท่านั้น
อย่าถือว่าฉันมีฐานข้อมูลห้องแบบธรรมดา: @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: A migration from 1 to 2 is …

9
ห้องสมุดความคงอยู่ของห้อง Android: อัปเดต
ไลบรารีความคงอยู่ของ Room ของ Android มีคำอธิบายประกอบ @Insert และ @Update ที่ใช้กับวัตถุหรือคอลเล็กชัน อย่างไรก็ตามฉันมีกรณีการใช้งาน (การแจ้งเตือนแบบพุชที่มีโมเดล) ที่ต้องใช้ UPSERT เนื่องจากข้อมูลอาจมีหรือไม่มีอยู่ในฐานข้อมูล Sqlite ไม่มีการเพิ่มขึ้นโดยกำเนิดและวิธีแก้ปัญหาจะอธิบายไว้ในคำถาม SOนี้ จากวิธีแก้ปัญหาที่นั่นเราจะนำไปใช้กับ Room ได้อย่างไร เพื่อให้เจาะจงมากขึ้นฉันจะใช้การแทรกหรือการอัปเดตในห้องที่ไม่ทำลายข้อ จำกัด ของคีย์แปลกปลอมได้อย่างไร การใช้การแทรกกับ onConflict = REPLACE จะทำให้ onDelete สำหรับคีย์ต่างประเทศใด ๆ ในแถวนั้นถูกเรียก ในกรณีของฉัน onDelete ทำให้เกิดการเรียงซ้อนและการใส่แถวใหม่จะทำให้แถวในตารางอื่นที่มีคีย์นอกนั้นถูกลบ นี่ไม่ใช่พฤติกรรมที่ตั้งใจไว้


5
วิธีอัปเดต LiveData ของ ViewModel จากบริการเบื้องหลังและอัปเดต UI
เมื่อเร็ว ๆ นี้ฉันกำลังสำรวจสถาปัตยกรรม Android ซึ่งได้รับการแนะนำโดย Google เมื่อเร็ว ๆ นี้ จากเอกสารฉันพบสิ่งนี้: public class MyViewModel extends ViewModel { private MutableLiveData<List<User>> users; public LiveData<List<User>> getUsers() { if (users == null) { users = new MutableLiveData<List<Users>>(); loadUsers(); } return users; } private void loadUsers() { // do async operation to fetch users } } …

20
ห้องไม่สามารถตรวจสอบความสมบูรณ์ของข้อมูลได้
ฉันได้รับข้อผิดพลาดนี้ขณะใช้งานโปรแกรมกับ Room Database Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number. ดูเหมือนว่าเราจำเป็นต้องอัปเดตเวอร์ชันของฐานข้อมูล แต่เราสามารถทำได้จากที่ใดในห้อง?

6
ห้อง Android: แทรกเอนทิตีความสัมพันธ์โดยใช้ห้อง
ฉันได้เพิ่มอีกหนึ่งความสัมพันธ์จำนวนมากในห้องพักโดยใช้ความสัมพันธ์ ฉันอ้างถึงโพสต์นี้เพื่อเขียนโค้ดต่อไปนี้สำหรับความสัมพันธ์ในห้อง โพสต์จะบอกวิธีอ่านค่าจากฐานข้อมูล แต่การจัดเก็บเอนทิตีลงในฐานข้อมูลทำให้userIdว่างซึ่งหมายความว่าไม่มีความสัมพันธ์ระหว่าง 2 ตาราง ฉันไม่แน่ใจว่าอะไรคือวิธีที่ดีที่สุดในinsertการเข้าUserและList of Petเข้าสู่ฐานข้อมูลในขณะที่มีuserIdค่า 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 …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.