user9827495
user9827495

Reputation:

Error while trying to populate Room DB

When i'm trying to populate the DB with an OnClick method the app crash with the following errors:

05-28 10:18:44.795 24503-25060/com.example.igardini.visualposmobile E/SQLiteLog: (283) recovered 9 frames from WAL file /data/data/com.example.igardini.visualposmobile/databases/clienti_db-wal
05-28 10:18:44.824 24503-25060/com.example.igardini.visualposmobile E/SQLiteLog: (1555) abort at 32 in [INSERT OR ABORT INTO `clienti`(`ID_CLI`,`COD_CLI`,`RS1_CLI`,`RS2_CLI`,`IND_CLI`,`LOC_CLI`,`CITTA_CLI`,`CAP_CLI`,`NAZ_CLI`,`PIVA_CLI`,`PROV_CLI`,`CF_CLI`,`SCONTO_CLI`,`LISTINO_CLI`,`IDMOV_CLI`,`
05-28 10:18:44.825 24503-25060/com.example.igardini.visualposmobile E/AndroidRuntime: FATAL EXCEPTION: Thread-18872
    Process: com.example.igardini.visualposmobile, PID: 24503
    android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: clienti.ID_CLI (code 1555)
        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:50)
        at android.arch.persistence.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.java:64)
        at com.example.igardini.visualposmobile.ClientiDao_Impl.insert(ClientiDao_Impl.java:166)
        at com.example.igardini.visualposmobile.MainActivity$1$1.run(MainActivity.java:82)
        at java.lang.Thread.run(Thread.java:818)

Here is what is in my MainActivity connected to DB:

    posRoomDatabase = Room.databaseBuilder(getApplicationContext(),
            POSRoomDatabase.class, DATABASE_NAME)
            .fallbackToDestructiveMigration()
            .build();




    DB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    clienti clients =new clienti();
                    clients.setID(appBODY[0]);
                    clients.setCOD(appBODY[1]);
                    clients.setRS1(appBODY[2]);
                    clients.setRS2(appBODY[3]);
                    clients.setIND(appBODY[4]);
                    clients.setLOC(appBODY[5]);
                    clients.setCIT(appBODY[6]);
                    clients.setCAP(appBODY[7]);
                    clients.setNAZ(appBODY[8]);
                    clients.setPIVA(appBODY[9]);
                    clients.setPROV(appBODY[10]);
                    clients.setCF(appBODY[11]);
                    clients.setSCON(appBODY[12]);
                    clients.setLIST(appBODY[13]);
                    clients.setIDMOV(appBODY[14]);
                    clients.setDESMOV(appBODY[15]);
                    clients.setM2(appBODY[16]);
                    clients.setMEM(appBODY[17]);
                    clients.setMAIL(appBODY[18]);
                    clients.setIDPAG(appBODY[19]);
                    clients.setDESPAG(appBODY[20]);
                    clients.setESENZ(appBODY[21]);
                    posRoomDatabase.clientiDao().insert(clients);
                }
            }) .start();
        }
    });

Actually my app just taking HTML code from a website, converting string by just taking data and all that's data is going in an Array string so i just simply trying to populate DB with that data but i'm not very in to android so could you help me?

After i've changed the INSERT query i'm getting the following error:

05-28 11:06:12.345 31659-31677/com.example.igardini.visualposmobile E/Database: file is encrypted or is not a database: , while compiling: select count(*) from sqlite_master;
    net.sqlcipher.database.SQLiteException: file is encrypted or is not a database: , while compiling: select count(*) from sqlite_master;
        at net.sqlcipher.database.SQLiteCompiledSql.native_compile(Native Method)
        at net.sqlcipher.database.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
        at net.sqlcipher.database.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
        at net.sqlcipher.database.SQLiteProgram.<init>(SQLiteProgram.java:89)
        at net.sqlcipher.database.SQLiteQuery.<init>(SQLiteQuery.java:48)
        at net.sqlcipher.database.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:60)
        at net.sqlcipher.database.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1867)
        at net.sqlcipher.database.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1785)
        at net.sqlcipher.database.SQLiteDatabase.keyDatabase(SQLiteDatabase.java:2486)
        at net.sqlcipher.database.SQLiteDatabase.openDatabaseInternal(SQLiteDatabase.java:2415)
        at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1149)
        at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1116)
        at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1065)
        at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1226)
        at com.amitshekhar.server.RequestHandler.openDatabase(RequestHandler.java:185)
        at com.amitshekhar.server.RequestHandler.getTableListResponse(RequestHandler.java:304)
        at com.amitshekhar.server.RequestHandler.handle(RequestHandler.java:113)
        at com.amitshekhar.server.ClientServer.run(ClientServer.java:76)
        at java.lang.Thread.run(Thread.java:818)

Upvotes: 1

Views: 851

Answers (1)

Deˣ
Deˣ

Reputation: 4381

As the error log says the UNIQUE constraint is violated on clienti.ID_CLI. You have defined clienti.ID_CLI unique. But there is already a row with given clienti.ID_CLI. You need to check first if there is any data for clienti.ID_CLI exists. If yes update else insert. The process should be:-

data: getData with clienti.ID_CLI 
if(data exists)
  update 
else 
  insert

You can also update your insert method like this

@Insert(onConflict = OnConflictStrategy.REPLACE)
  void insert(clienti client);

 // Insert multiple items
 @Insert(onConflict = OnConflictStrategy.REPLACE)
  void insert(clienti ... client);

Upvotes: 3

Related Questions