尝试填充Room DB时出错

时间:2018-05-28 08:23:23

标签: android android-room

当我尝试使用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连接到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();
        }
    });

实际上我的应用程序只是从网站上获取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 :(得分:3)

由于错误日志表明clienti.ID_CLI违反了UNIQUE约束。您已将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);