筛选出SQL Android数据

时间:2018-09-04 18:25:55

标签: android sqlite

我有一个包含c ++代码的字符串。

这些代码可能包含单引号或双引号以及许多这样的东西,

我想在执行sql之前将它们过滤掉以将其插入到SQLite数据库(Android)中,所以,我应该运行哪种Java代码来做到这一点,而又不会干扰/扭曲c ++代码,因此当我读取sql时数据库中的代码应与以前一样。

1 个答案:

答案 0 :(得分:1)

使用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

即第二行进行了相应的过滤。