Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Product.java
- import android.arch.persistence.room.ColumnInfo;
- import android.arch.persistence.room.Entity;
- import android.arch.persistence.room.ForeignKey;
- import android.arch.persistence.room.Index;
- import android.arch.persistence.room.PrimaryKey;
- import static android.arch.persistence.room.ForeignKey.CASCADE;
- @Entity(tableName = "product_table", foreignKeys = @ForeignKey(entity = Department.class,
- parentColumns = "id",
- childColumns = "dept_id",
- onDelete = CASCADE),
- indices = @Index(value = "dept_id"))
- public class Product {
- @PrimaryKey(autoGenerate = true)
- private int id;
- @ColumnInfo(name = "products")
- private String productName;
- @ColumnInfo(name = "dept_id")
- private int deptID;
- public Product(String productName, int deptID){
- this.productName = productName;
- this.deptID = deptID;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getProductName() {
- return productName;
- }
- public void setProductName(String pName) {
- this.productName = pName;
- }
- public int getDeptID() {
- return deptID;
- }
- public void setDeptID(int deptID) {
- this.deptID = deptID;
- }
- }
- Department.java
- package com.oakware.seven.shopmate;
- import android.arch.persistence.room.ColumnInfo;
- import android.arch.persistence.room.Entity;
- import android.arch.persistence.room.PrimaryKey;
- import android.support.annotation.NonNull;
- @Entity(tableName = "department_table")
- public class Department {
- @PrimaryKey(autoGenerate = true)
- private int id;
- @ColumnInfo(name = "departments")
- private String deptName;
- public Department(String deptName){
- this.deptName = deptName;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getDeptName() {
- return deptName;
- }
- public void setDeptName(String deptName) {
- this.deptName = deptName;
- }
- }
- ProductDao.java
- package com.oakware.seven.shopmate;
- import android.arch.lifecycle.LiveData;
- import android.arch.persistence.room.Dao;
- import android.arch.persistence.room.Insert;
- import android.arch.persistence.room.OnConflictStrategy;
- import android.arch.persistence.room.Query;
- import java.util.List;
- @Dao
- public interface ProductDao {
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- void insert(Product product);
- @Insert
- void insertProducts(Product... products);
- @Query("DELETE FROM product_table")
- void deleteAll();
- @Query("SELECT * FROM product_table ORDER BY products asc")
- LiveData<List<Product>> getAllProducts();
- }
- ShopRoomDatabase.java
- package com.oakware.seven.shopmate;
- import android.arch.persistence.db.SupportSQLiteDatabase;
- import android.arch.persistence.room.Database;
- import android.arch.persistence.room.Room;
- import android.arch.persistence.room.RoomDatabase;
- import android.content.Context;
- import android.os.AsyncTask;
- import android.support.annotation.NonNull;
- import android.util.Log;
- @Database(entities = {Department.class, Product.class}, version = 1)
- public abstract class ShopRoomDatabase extends RoomDatabase {
- public abstract DepartmentDao departmentDao();
- public abstract ProductDao productDao();
- private static ShopRoomDatabase INSTANCE;
- public static ShopRoomDatabase getDatabase(final Context context) {
- if (INSTANCE == null) {
- synchronized (ShopRoomDatabase.class) {
- if (INSTANCE == null) {
- //create database
- Log.i("Database", "Instance is null, creating database");
- INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
- ShopRoomDatabase.class,
- "shop_database")
- .addCallback(sRoomDatabaseCallback)
- .build();
- }
- }
- }
- return INSTANCE;
- }
- private static RoomDatabase.Callback sRoomDatabaseCallback =
- new RoomDatabase.Callback() {
- @Override
- public void onOpen(@NonNull SupportSQLiteDatabase db) {
- super.onOpen(db);
- new PopulateDbAsync(INSTANCE).execute();
- }
- };
- private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {
- private final ProductDao mProductDao;
- private final DepartmentDao mDeptDao;
- PopulateDbAsync(ShopRoomDatabase db) {
- mDeptDao = db.departmentDao();
- mProductDao = db.productDao();
- }
- @Override
- protected Void doInBackground(final Void... params) {
- mDeptDao.deleteAll();
- mProductDao.deleteAll();
- Department department = new Department("unassigned");
- mDeptDao.insert(department);
- Log.i("department name", department.getDeptName()+ " with id "+ Integer.toString(department.getId()));
- Product product = new Product("Banana", department.getId());
- Log.i("product name", product.getProductName()+ " with DeptID "+ Integer.toString(product.getDeptID()));
- mProductDao.insert(product);
- product = new Product("Milk", department.getId());
- Log.i("product name", product.getProductName()+ " with DeptID "+ Integer.toString(product.getDeptID()));
- mProductDao.insert(product);
- return null;
- }
- }
- }
- Error message (with some context)
- I/Database: Instance is null, creating database
- D/: HostConnection::get() New Host Connection established 0x9eb15840, tid 7321
- I/department name: unassigned with id 0
- I/product name: Banana with DeptID 0
- E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
- Process: com.oakware.seven.shopmate, PID: 7321
- java.lang.RuntimeException: An error occurred while executing doInBackground()
- at android.os.AsyncTask$3.done(AsyncTask.java:318)
- at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
- at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
- at java.util.concurrent.FutureTask.run(FutureTask.java:242)
- at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
- at java.lang.Thread.run(Thread.java:761)
- Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
- at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
- at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
- at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
- at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
- at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:79)
- at android.arch.persistence.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.java:64)
- at com.oakware.seven.shopmate.ProductDao_Impl.insert(ProductDao_Impl.java:77)
- at com.oakware.seven.shopmate.ShopRoomDatabase$PopulateDbAsync.doInBackground(ShopRoomDatabase.java:69)
- at com.oakware.seven.shopmate.ShopRoomDatabase$PopulateDbAsync.doInBackground(ShopRoomDatabase.java:48)
- at android.os.AsyncTask$2.call(AsyncTask.java:304)
- at java.util.concurrent.FutureTask.run(FutureTask.java:237)
- at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
- at java.lang.Thread.run(Thread.java:761)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement