Advertisement
Guest User

room foreignkey fail

a guest
Jul 28th, 2018
766
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.71 KB | None | 0 0
  1. Product.java
  2.  
  3. import android.arch.persistence.room.ColumnInfo;
  4. import android.arch.persistence.room.Entity;
  5. import android.arch.persistence.room.ForeignKey;
  6. import android.arch.persistence.room.Index;
  7. import android.arch.persistence.room.PrimaryKey;
  8. import static android.arch.persistence.room.ForeignKey.CASCADE;
  9.  
  10. @Entity(tableName = "product_table", foreignKeys = @ForeignKey(entity = Department.class,
  11. parentColumns = "id",
  12. childColumns = "dept_id",
  13. onDelete = CASCADE),
  14. indices = @Index(value = "dept_id"))
  15.  
  16. public class Product {
  17.  
  18. @PrimaryKey(autoGenerate = true)
  19. private int id;
  20.  
  21. @ColumnInfo(name = "products")
  22. private String productName;
  23.  
  24. @ColumnInfo(name = "dept_id")
  25. private int deptID;
  26.  
  27. public Product(String productName, int deptID){
  28. this.productName = productName;
  29. this.deptID = deptID;
  30. }
  31.  
  32. public int getId() {
  33. return id;
  34. }
  35.  
  36. public void setId(int id) {
  37. this.id = id;
  38. }
  39.  
  40. public String getProductName() {
  41. return productName;
  42. }
  43.  
  44. public void setProductName(String pName) {
  45. this.productName = pName;
  46. }
  47.  
  48. public int getDeptID() {
  49. return deptID;
  50. }
  51.  
  52. public void setDeptID(int deptID) {
  53. this.deptID = deptID;
  54. }
  55. }
  56.  
  57. Department.java
  58.  
  59. package com.oakware.seven.shopmate;
  60.  
  61. import android.arch.persistence.room.ColumnInfo;
  62. import android.arch.persistence.room.Entity;
  63. import android.arch.persistence.room.PrimaryKey;
  64. import android.support.annotation.NonNull;
  65.  
  66. @Entity(tableName = "department_table")
  67. public class Department {
  68.  
  69. @PrimaryKey(autoGenerate = true)
  70. private int id;
  71.  
  72. @ColumnInfo(name = "departments")
  73. private String deptName;
  74.  
  75. public Department(String deptName){
  76. this.deptName = deptName;
  77. }
  78.  
  79. public int getId() {
  80. return id;
  81. }
  82.  
  83. public void setId(int id) {
  84. this.id = id;
  85. }
  86.  
  87. public String getDeptName() {
  88. return deptName;
  89. }
  90.  
  91. public void setDeptName(String deptName) {
  92. this.deptName = deptName;
  93. }
  94. }
  95.  
  96. ProductDao.java
  97.  
  98. package com.oakware.seven.shopmate;
  99.  
  100. import android.arch.lifecycle.LiveData;
  101. import android.arch.persistence.room.Dao;
  102. import android.arch.persistence.room.Insert;
  103. import android.arch.persistence.room.OnConflictStrategy;
  104. import android.arch.persistence.room.Query;
  105.  
  106. import java.util.List;
  107.  
  108. @Dao
  109. public interface ProductDao {
  110.  
  111. @Insert(onConflict = OnConflictStrategy.REPLACE)
  112. void insert(Product product);
  113.  
  114. @Insert
  115. void insertProducts(Product... products);
  116.  
  117. @Query("DELETE FROM product_table")
  118. void deleteAll();
  119.  
  120. @Query("SELECT * FROM product_table ORDER BY products asc")
  121. LiveData<List<Product>> getAllProducts();
  122. }
  123.  
  124. ShopRoomDatabase.java
  125.  
  126. package com.oakware.seven.shopmate;
  127.  
  128. import android.arch.persistence.db.SupportSQLiteDatabase;
  129. import android.arch.persistence.room.Database;
  130. import android.arch.persistence.room.Room;
  131. import android.arch.persistence.room.RoomDatabase;
  132. import android.content.Context;
  133. import android.os.AsyncTask;
  134. import android.support.annotation.NonNull;
  135. import android.util.Log;
  136.  
  137. @Database(entities = {Department.class, Product.class}, version = 1)
  138. public abstract class ShopRoomDatabase extends RoomDatabase {
  139.  
  140. public abstract DepartmentDao departmentDao();
  141. public abstract ProductDao productDao();
  142.  
  143. private static ShopRoomDatabase INSTANCE;
  144.  
  145. public static ShopRoomDatabase getDatabase(final Context context) {
  146. if (INSTANCE == null) {
  147. synchronized (ShopRoomDatabase.class) {
  148. if (INSTANCE == null) {
  149. //create database
  150. Log.i("Database", "Instance is null, creating database");
  151. INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
  152. ShopRoomDatabase.class,
  153. "shop_database")
  154. .addCallback(sRoomDatabaseCallback)
  155. .build();
  156. }
  157. }
  158. }
  159. return INSTANCE;
  160. }
  161.  
  162. private static RoomDatabase.Callback sRoomDatabaseCallback =
  163. new RoomDatabase.Callback() {
  164.  
  165. @Override
  166. public void onOpen(@NonNull SupportSQLiteDatabase db) {
  167. super.onOpen(db);
  168. new PopulateDbAsync(INSTANCE).execute();
  169. }
  170. };
  171.  
  172.  
  173. private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {
  174.  
  175. private final ProductDao mProductDao;
  176. private final DepartmentDao mDeptDao;
  177.  
  178. PopulateDbAsync(ShopRoomDatabase db) {
  179. mDeptDao = db.departmentDao();
  180. mProductDao = db.productDao();
  181.  
  182. }
  183.  
  184. @Override
  185. protected Void doInBackground(final Void... params) {
  186. mDeptDao.deleteAll();
  187. mProductDao.deleteAll();
  188.  
  189. Department department = new Department("unassigned");
  190. mDeptDao.insert(department);
  191. Log.i("department name", department.getDeptName()+ " with id "+ Integer.toString(department.getId()));
  192. Product product = new Product("Banana", department.getId());
  193. Log.i("product name", product.getProductName()+ " with DeptID "+ Integer.toString(product.getDeptID()));
  194. mProductDao.insert(product);
  195. product = new Product("Milk", department.getId());
  196. Log.i("product name", product.getProductName()+ " with DeptID "+ Integer.toString(product.getDeptID()));
  197. mProductDao.insert(product);
  198. return null;
  199. }
  200. }
  201. }
  202.  
  203. Error message (with some context)
  204.  
  205. I/Database: Instance is null, creating database
  206. D/: HostConnection::get() New Host Connection established 0x9eb15840, tid 7321
  207. I/department name: unassigned with id 0
  208. I/product name: Banana with DeptID 0
  209. E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
  210. Process: com.oakware.seven.shopmate, PID: 7321
  211. java.lang.RuntimeException: An error occurred while executing doInBackground()
  212. at android.os.AsyncTask$3.done(AsyncTask.java:318)
  213. at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
  214. at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
  215. at java.util.concurrent.FutureTask.run(FutureTask.java:242)
  216. at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
  217. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
  218. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
  219. at java.lang.Thread.run(Thread.java:761)
  220. Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
  221. at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
  222. at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
  223. at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
  224. at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
  225. at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:79)
  226. at android.arch.persistence.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.java:64)
  227. at com.oakware.seven.shopmate.ProductDao_Impl.insert(ProductDao_Impl.java:77)
  228. at com.oakware.seven.shopmate.ShopRoomDatabase$PopulateDbAsync.doInBackground(ShopRoomDatabase.java:69)
  229. at com.oakware.seven.shopmate.ShopRoomDatabase$PopulateDbAsync.doInBackground(ShopRoomDatabase.java:48)
  230. at android.os.AsyncTask$2.call(AsyncTask.java:304)
  231. at java.util.concurrent.FutureTask.run(FutureTask.java:237)
  232. at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
  233. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
  234. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
  235. at java.lang.Thread.run(Thread.java:761) 
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement