相关疑难解决方法(0)

PreparedStatement如何避免或阻止SQL注入?

我知道PreparedStatements避免/阻止SQL注入.它是如何做到的?使用PreparedStatements构造的最终表单查询是字符串还是其他?

java sql sql-injection jdbc prepared-statement

111
推荐指数
4
解决办法
10万
查看次数

Android中的全文搜索示例

我很难理解如何在Android上使用全文搜索(FTS).我已经阅读了关于FTS3和FTS4扩展SQLite文档.而且我知道可以在Android上进行.但是,我很难找到任何我能理解的例子.

基本数据库模型

SQLite数据库表(已命名example_table)有4列.但是,只有一列(已命名text_column)需要为全文搜索编制索引.每行text_column包含长度从0到1000字不等的文本.总行数大于10,000.

  • 您将如何设置表和/或FTS虚拟表?
  • 你将如何执行FTS查询text_column

补充说明:

  • 因为只需要索引一列,所以仅使用FTS表(和删除example_table)对于非FTS查询来说效率低下.
  • 对于这样大的表,存储text_columnFTS表中的重复条目是不合需要的.这篇文章建议使用外部内容表.
  • 外部内容表使用FTS4,但在Android API 11之前不支持 FTS4 .答案可以假设API> = 11,但是评论支持较低版本的选项会很有帮助.
  • 更改原始表中的数据不会自动更新FTS表(反之亦然).在这个基本示例中,不需要在答案中包含触发器,但仍然会有所帮助.

sqlite android full-text-search

85
推荐指数
1
解决办法
3万
查看次数

Android数据库事务

我创建了一个数据库.我想做交易.SaveCustomer()包含多个语句,以便Customer, CustomerControl, Profile, Payment在那时将记录插入表中.

当用户调用 SaveCustomer()方法时,该数据将转到这4个表.所以我该如何进行交易?如果一个表插入失败,则需要回滚所有内容.例如,当第3个表插入记录时出现错误,那么还需要回滚前两个表的插入记录.

看我的代码:

public void saveCustomer(){
    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(RetailerOrderKeyActivity.this);
    dbAdapter.openDataBase();
    ContentValues initialValues = new ContentValues();
    initialValues.put("CustomerName",customer.getName());
    initialValues.put("Address",customer.getAddress());
    initialValues.put("CustomerPID",strPID);
    initialValues.put("Date",strDateOnly);
    long n = dbAdapter.insertRecordsInDB("Customer", null, initialValues);

}
Run Code Online (Sandbox Code Playgroud)

同样其他声明也在那里.

DBAdpter代码是:

public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) {
    long n =-1;
    try {
        myDataBase.beginTransaction();
        n = myDataBase.insert(tableName, nullColumnHack, initialValues);

        myDataBase.endTransaction();
        myDataBase.setTransactionSuccessful();
    } catch (Exception e) {
        // how to do the rollback 
        e.printStackTrace();
    }

    return n;
}
Run Code Online (Sandbox Code Playgroud)

这是完整的代码:

public class DBAdapter extends …
Run Code Online (Sandbox Code Playgroud)

sqlite android transactions

82
推荐指数
3
解决办法
9万
查看次数

Android SQLite:哪个查询("查询"或"rawQuery")更快?

我正在开发一个android数据库应用程序.我只是想知道哪些代码执行得更快,它们之间有什么区别?

查询 - 1 =

db.rawQuery("select * from user_table where user_id =" + userId, null);
Run Code Online (Sandbox Code Playgroud)

查询 - 2 =

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = " + userId, null, null, null, null);
Run Code Online (Sandbox Code Playgroud)

database android

25
推荐指数
2
解决办法
2万
查看次数

SQLite中的UPDATE语法

我需要知道我是否可以在UPDATE语句中执行此操作:

UPDATE users SET ('field1', 'field2', 'field3') 
VALUES ('value1', 'value2', 'value3');
Run Code Online (Sandbox Code Playgroud)

或者类似的语法.我正在使用SQLite.

注意:

没有人理解我,我只是想知道是否可以设置单独的字段来分隔值.就这样.

sql sqlite sql-update

17
推荐指数
4
解决办法
6万
查看次数

在Android中使用预准备语句查询?

在Android中,android.database.sqlite.SQLiteStatement允许我在SQLite中使用预准备语句来避免注入攻击.它的execute方法适用于创建/更新/删除操作,但似乎没有任何返回游标等的查询方法.

现在在iOS中我可以创建类型的预准备语句sqlite3_stmt*并将它们用于查询,所以我知道这不是SQLite的限制.如何在Android中使用预准备语句执行查询?

sql sqlite android prepared-statement

14
推荐指数
1
解决办法
2万
查看次数

SQLite rawQuery selectionArgs和Integers字段

正如Android文档所说,rawQuery方法的selectionArgs参数被解析为字符串.

SQLiteDatabase.rawQuery(String sql,String [] selectionArgs)

selectionArgs:您可以在查询中的where子句中包含?s,它将被selectionArgs中的值替换.这些值将绑定为字符串.

但是今天,我遇到了一个问题,这个问题花了我很大的一天.想象一下以下查询:

SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= 15
Run Code Online (Sandbox Code Playgroud)

COLUMN_A是INTEGER.该表有大约10行符合该标准.在数据库编辑器上运行查询,结果始终是正确的,但是,在智能手机上,语句始终不返回任何行.

一段时间后,将查询更改为:

SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= '15'
Run Code Online (Sandbox Code Playgroud)

并且编辑器没有返回任何行,就像Android一样.因此,将查询更改为:

SELECT * FROM TABLE_A WHERE CAST(IFNULL(COLUMN_A, 0) as INTEGER) >= '15'
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.另一项测试是:

SELECT * FROM TABLE_A WHERE COLUMN_A >= '15'
Run Code Online (Sandbox Code Playgroud)

还,返回了正确的结果.

这似乎是一个问题,涉及Android使用IFNULL子句将参数绑定到查询(作为字符串)的方式.

那么,有人知道为什么会这样吗?如果不在查询中使用CAST,是否有任何建议可以解决这个问题?

sqlite android

9
推荐指数
1
解决办法
1万
查看次数

如何在SQLite Database Varchar字段中插入双引号(")?

我正试图在这个字段TITLE varchar(200) NOT NULL的表格中插入下一句话:

INSERT OR IGNORE INTO EXAMPLETABLE VALUES ("1-Preludi \"Obrint Pas 2011\"", ... 
Run Code Online (Sandbox Code Playgroud)

问题是SQLite错误地理解了"逃避问题,我不知道如何在我的Android程序中解决问题(也许是字符代码?)".

sqlite android

8
推荐指数
2
解决办法
2万
查看次数

SQLiteStatement执行SELECT/INSERT/DELETE/UPDATE

我正在使用已编译SQLiteStatement的事务来优化SQLite事务,但我正在阅读该execute函数的文档:

如果它不是SELECT/INSERT/DELETE/UPDATE,执行此SQL语句,例如CREATE/DROP表,视图,触发器,索引等.

这似乎意味着这个函数不应该与SELECT / INSERT / DELETE / UPDATE语句一起使用,但我有一个代码,它使用插入和工作.

我知道executeInsert和其他方法,但executeUpdateDelete在我的API级别不可用,所以我可以使用execute吗?

另外,如果我不需要最后一个插入ID或受影响的行数,我应该使用execute而不是executeInsert等等,换句话说,它是否更有效?

sqlite android android-sqlite

6
推荐指数
1
解决办法
4958
查看次数

Android:在sqlite数据库中插入多行无法正常工作

我使用以下方法为android项目将单行插入数据库.

myDB.execSQL("INSERT INTO "
 + Buss
 + " (BussName, RouteName)"
 + " VALUES ('buss1', 'buss2');");
Run Code Online (Sandbox Code Playgroud)

它工作正常.我看到这个链接在sqlite数据库中插入多行.我在我的android项目中尝试这种方法(插入多行),但它不起作用.

myDB.execSQL("INSERT INTO "
 + Buss
 + " (BussName, RouteName)"
 + " VALUES ('buss1', 'buss2'),('buss1', 'buss2'),('buss1', 'buss2');");
Run Code Online (Sandbox Code Playgroud)

怎么做?

sqlite android

6
推荐指数
2
解决办法
1万
查看次数