我知道PreparedStatements避免/阻止SQL注入.它是如何做到的?使用PreparedStatements构造的最终表单查询是字符串还是其他?
我很难理解如何在Android上使用全文搜索(FTS).我已经阅读了关于FTS3和FTS4扩展的SQLite文档.而且我知道可以在Android上进行.但是,我很难找到任何我能理解的例子.
SQLite数据库表(已命名example_table)有4列.但是,只有一列(已命名text_column)需要为全文搜索编制索引.每行text_column包含长度从0到1000字不等的文本.总行数大于10,000.
text_column?补充说明:
example_table)对于非FTS查询来说效率低下.text_columnFTS表中的重复条目是不合需要的.这篇文章建议使用外部内容表.我创建了一个数据库.我想做交易.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) 我正在开发一个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) 我需要知道我是否可以在UPDATE语句中执行此操作:
UPDATE users SET ('field1', 'field2', 'field3')
VALUES ('value1', 'value2', 'value3');
Run Code Online (Sandbox Code Playgroud)
或者类似的语法.我正在使用SQLite.
注意:
没有人理解我,我只是想知道是否可以设置单独的字段来分隔值.就这样.
在Android中,android.database.sqlite.SQLiteStatement允许我在SQLite中使用预准备语句来避免注入攻击.它的execute方法适用于创建/更新/删除操作,但似乎没有任何返回游标等的查询方法.
现在在iOS中我可以创建类型的预准备语句sqlite3_stmt*并将它们用于查询,所以我知道这不是SQLite的限制.如何在Android中使用预准备语句执行查询?
正如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,是否有任何建议可以解决这个问题?
我正试图在这个字段TITLE varchar(200) NOT NULL的表格中插入下一句话:
INSERT OR IGNORE INTO EXAMPLETABLE VALUES ("1-Preludi \"Obrint Pas 2011\"", ...
Run Code Online (Sandbox Code Playgroud)
问题是SQLite错误地理解了"逃避问题,我不知道如何在我的Android程序中解决问题(也许是字符代码?)".
我正在使用已编译SQLiteStatement的事务来优化SQLite事务,但我正在阅读该execute函数的文档:
如果它不是SELECT/INSERT/DELETE/UPDATE,则执行此SQL语句,例如CREATE/DROP表,视图,触发器,索引等.
这似乎意味着这个函数不应该与SELECT / INSERT / DELETE / UPDATE语句一起使用,但我有一个代码,它使用插入和工作.
我知道executeInsert和其他方法,但executeUpdateDelete在我的API级别不可用,所以我可以使用execute吗?
另外,如果我不需要最后一个插入ID或受影响的行数,我应该使用execute而不是executeInsert等等,换句话说,它是否更有效?
我使用以下方法为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)
怎么做?