Фильтрация данных для SQL Android - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть строки, которые содержат коды C ++.

эти коды могут содержать одинарные или двойные кавычки и много таких вещей,

Я хочу отфильтровать эти символы перед выполнением sql, чтобы вставить их в базу данных SQLite (Android), поэтому какой Java-код я должен выполнить, чтобы не нарушать / не искажать код c ++, чтобы при чтении sql В базе данных код должен быть как прежде.

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете фильтровать (заменить ничем) при извлечении данных с использованием SQL.

например. такой запрос может быть: -

SELECT replace(replace(col1,'''',''),'"','') FROM cpluspluscode;
  • , где соответствующий столбец col1 , а таблица cpluspluscode .

Ниже приведен пример, показывающий, как это работает: -

DROP TABLE IF EXISTS cpluspluscode;
CREATE TABLE IF NOT EXISTS cpluspluscode (col1 TEXT);
INSERT INTO cpluspluscode VALUES('''mytext'' "other text"');
SELECT * FROM cpluspluscode;
SELECT replace(replace(col1,'''',''),'"','') AS filtered FROM cpluspluscode;

Результаты вышесказанного: -

Без фильтрации: -

enter image description here

Отфильтровано: -

enter image description here

Unicode

Если вы хотите, чтобы сделать выше, используя Unicode, то вы можете использовать: -

SELECT replace(replace(col1,char(0034),''),char(39),'') AS filtered FROM cpluspluscode;
  • При этом используется основная функция SQLite char (см. Ссылку выше).
  • Основная функция unicode может использоваться для поиска Unicode для символа (снова см. Ссылку выше).

Пример Android

Предполагается, что подкласс SQLiteOpenHelper DatabaseHelper , и это создает таблицу в соответствии с: -

public static final String TABLE_CPLUSPLUSCODE = "cpluspluscode";
public static final String COLUMN1 = "col1";

.........

@Override
public void onCreate(SQLiteDatabase db) {
    String crtcpp = "CREATE TABLE IF NOT EXISTS " + TABLE_CPLUSPLUSCODE + "(" +
            COLUMN1 + " TEXT" +
            ")";
    db.execSQL(crtcpp);
}

И DatabaseHelper включает методы: -

public long cppInsert(String value) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(COLUMN1,value);
    return db.insert(TABLE_CPLUSPLUSCODE,null,cv);
}

public Cursor getFiltered() {
    SQLiteDatabase db = this.getWritableDatabase();
    String[] columns = new String[]{"replace(replace(" + COLUMN1 + ",'''',''),'\"','') AS " + COLUMN1};
    return db.query(TABLE_CPLUSPLUSCODE,columns,null,null,null,null,null);
}

public Cursor getUnfiltered() {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.query(TABLE_CPLUSPLUSCODE,null,null,null,null, null, null);
}

Затем используйте следующее (в упражнении): -

    DatabaseHelper mDBHlp = new DatabaseHelper(this);

    mDBHlp.cppInsert("''mydata'' \" other data\"");
    Cursor csr1 = mDBHlp.getUnfiltered();
    while (csr1.moveToNext()) {
        Log.d("CSR1DATA",csr1.getString(csr1.getColumnIndex(DatabaseHelper.COLUMN1)));
    }
    csr1.close();
    Cursor csr2 = mDBHlp.getFiltered();
    while (csr2.moveToNext()) {
        Log.d("CSR2DATA",csr2.getString(csr2.getColumnIndex(DatabaseHelper.COLUMN1)));
    }

Результаты: -

09-05 04:39:14.003 3471-3471/so52115977.so52115977 D/CSR1DATA: ''mydata'' " other data"
09-05 04:39:14.003 3471-3471/so52115977.so52115977 D/CSR2DATA: mydata  other data

т.е. вторая строка фильтруется соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...