当我尝试使用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)
答案 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);