Мне нужно переписать это SQLite Заявления с Java на C ++, потому что низкая производительность:
Я красную арктику
Улучшить производительность SQLite INSERT-в-секунду?
Но я полностью запутался, потому что я не могу найти никакого sqlstatemenst вставки или обновления
public synchronized void saveMatchValue(int photoRecOwner, int[] photoRecAssign, float[] value) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
database.beginTransaction();
В Java:
String sql = " INSERT OR REPLACE INTO " + TypeContract.CTablePhotoMatch.TABLE_NAME + "("+ TypeContract.CTablePhotoMatch.FK_OWNER + "," + TypeContract.CTablePhotoMatch.FK_ASSIGN + ","+ TypeContract.CTablePhotoMatch.VALUE + ") VALUES (?, ?, ?) ;";
// Это может быть то же самое в C ++? лайк
string sqlstatement = "INSERT INTO abe_account ("...........
И отдых для меня ясен плюс минус // это
SQLiteStatement stmt = database.compileStatement(sql);// stmt.bindDouble(index, value);
// database.compileStatement(sql)
try {
String[] whereArgs = new String[2];
int rows = 0;
for (int i = 0; i < photoRecAssign.length; i++) {
if (photoRecOwner > photoRecAssign[i]) {
stmt.bindDouble(1, photoRecOwner);
stmt.bindDouble(2, photoRecAssign[i]);} else {
stmt.bindDouble(1, photoRecAssign[i]);
stmt.bindDouble(2, photoRecOwner);}
stmt.bindDouble(3, value[i]);
try {
long entryID = stmt.executeInsert();
} catch (Exception e) {
// updtStmt.executeUpdateDelete();
} finally {
stmt.clearBindings();
}
// ContentValues contentValues = crossTableContentValues(
// photoRecOwner, photoRecAssign[i], value[i]);
// database.insert(TypeContract.CTablePhotoMatch.TABLE_NAME,
// null,
// contentValues);
}
database.setTransactionSuccessful();
} finally {
stmt.close();
database.endTransaction();
// database.close();
}
}
Ты можешь использовать std::to_string
построить строку, используя ваши переменные
#include <string>
std::string sql = " INSERT OR REPLACE INTO " + std::to_string(TypeContract.CTablePhotoMatch.TABLE_NAME) + "(" + ...;
Если какая-либо из ваших переменных уже std::string
, тогда вам не нужно использовать эту функцию, вы можете просто использовать +
соединить
это нормально?
void NativeSaveMAValues(int size,int photoRecOwner,int photoRecAssign[],double value[]){
sqlite3 *db;
sqlite3_stmt * stmt;
char * sErrMsg = 0;
char * tail = 0;
int nRetCode;
char sSQL [BUFFER_SIZE] = "\0";
//sqlite3_prepare_v2(db, sSQL, BUFFER_SIZE, &stmt, &tail);
std::string sqlstatement = std::string(" INSERT OR REPLACE INTO CrossPhotoMatchTable") + "("+ "fk_owner" + ","+ "fk_assign" + ","+ "value" + ") VALUES (?, ?, ?) ;";
sqlite3_prepare( db, sqlstatement.c_str(), -1, &stmt, NULL );
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg);
for (int i = 0; i < size; i++) {
if (photoRecOwner > photoRecAssign[i]) {
sqlite3_bind_int(stmt, 1, photoRecOwner);
sqlite3_bind_int(stmt, 2, photoRecAssign[i]);
// stmt.bindDouble(1, photoRecOwner);} else {
sqlite3_bind_int(stmt, 1, photoRecAssign[i]);
sqlite3_bind_int(stmt, 2, photoRecOwner);
}
sqlite3_bind_double(stmt, 3, value[i]);try {
sqlite3_step(stmt);//todo isDONE?:
sqlite3_clear_bindings(stmt);
sqlite3_reset(stmt);
} catch (std::exception e) { // updtStmt.executeUpdateDelete();}
}
sqlite3_exec(db, "END TRANSACTION", NULL, NULL, &sErrMsg);
sqlite3_finalize(stmt);
}