Ошибка при попытке заполнить комнату БД - PullRequest
0 голосов
/ 28 мая 2018

Когда я пытаюсь заполнить БД методом OnClick, приложение вылетает со следующими ошибками:

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)

Вот что в моей MainActivity подключено к БД:

    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();
        }
    });

На самом деле мое приложение просто берет HTML-код с веб-сайта, конвертирует строку, просто беря данные, и все эти данные собираются в строку массива, поэтому я просто пытаюсь заполнить БД этими данными, но я не очень разбираюсь в Androidне могли бы вы мне помочь?

После того, как я изменил запрос INSERT, я получаю следующую ошибку:

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)

1 Ответ

0 голосов
/ 28 мая 2018

Поскольку журнал ошибок говорит, что ограничение UNIQUE нарушено на clienti.ID_CLI.Вы определили clienti.ID_CLI уникальным.Но уже есть строка с заданным clienti.ID_CLI.Сначала необходимо проверить, существуют ли какие-либо данные для clienti.ID_CLI.Если да, обновите еще, вставьте.Процесс должен быть: -

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

Вы также можете обновить свой метод вставки, как этот

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

 // Insert multiple items
 @Insert(onConflict = OnConflictStrategy.REPLACE)
  void insert(clienti ... client);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...