我想执行如下查询:
uvalue = EditText( some user value );
p_query = "select * from mytable where name_field = '" + uvalue + "'" ;
mDb.rawQuery( p_query, null );
Run Code Online (Sandbox Code Playgroud)
如果用户在输入中输入单引号,则会崩溃.如果您将其更改为:
p_query = "select * from mytable where name_field = \"" + uvalue + "\"" ;
Run Code Online (Sandbox Code Playgroud)
如果用户在输入中输入双引号,它就会崩溃.当然,他们总是可以输入单引号和双引号.
我有一个列表,每行有3行代表一个表行:
>>> print list
[laks,444,M]
[kam,445,M]
[kam,445,M]
Run Code Online (Sandbox Code Playgroud)
如何将此列表插入表中?
我的表结构是:
tablename(name varchar[100], age int, sex char[1])
或者我应该使用列表以外的东西?
这是实际的代码部分:
for record in self.server:
print "--->",record
t=record
self.cursor.execute("insert into server(server) values (?)",(t[0],));
self.cursor.execute("insert into server(id) values (?)",(t[1],))
self.cursor.execute("insert into server(status) values (?)",(t[2],));
Run Code Online (Sandbox Code Playgroud)
分别插入三个字段可以正常工作,但是使用单行
self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t[0],),(t[1],),(t[2],))
要么
self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t),)
才不是.
我需要修改SQLite数据库中的列,但由于数据库已经在生产中,我必须以编程方式执行此操作.根据我的研究,我发现为了做到这一点,我必须做到以下几点.
对于应该相对容易的事情而言,这似乎是一项荒谬的工作量.有没有更简单的方法?我需要做的就是更改现有列的约束并为其指定默认值.
我有一个python脚本,将原始电影文本文件读入sqlite数据库.
我使用re.escape(title)将转义字符添加到字符串中,以使它们在执行插入之前安全.
为什么这不起作用:
In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'")
--------------------------------------------------------------------------- OperationalError Traceback (most recent call last)
/home/rajat/Dropbox/amdb/<ipython console> in <module>()
OperationalError: near "Allo": syntax error
Run Code Online (Sandbox Code Playgroud)
然而,这有效(在两个地方删除):
In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: <sqlite3.Cursor object at 0x9666e90>
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚.我也不能放弃这些主流报价,因为它们实际上是电影片头的一部分.谢谢.
从PDO手册:
PDOStatement :: rowCount()返回 由相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响 的行数.
如果关联的PDOStatement执行的最后一个SQL语句是 SELECT语句,则某些数据库可能会返回该语句返回的行数.但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序.
我最近才发现这一点.我刚刚将我的数据库抽象层更改为不再使用SELECT COUNT(1) ...,因为只是查询实际的行然后计算结果会更有效率.现在PDO不支持!?
我没有将PDO用于MySQL和PgSQL,但我是为SQLite做的.有没有办法(没有完全改变dbal背部)在PDO中计算这样的行?在MySQL中,这将是这样的:
$q = $db->query('SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele');
$rows = $q->num_rows;
// and now use $q to get actual data
Run Code Online (Sandbox Code Playgroud)
使用MySQLi和PgSQL驱动程序,这是可能的.所有的PDO都不是!?
PS.我的初始解决方案是扩展SQLResult-> count方法(我自己的)以替换为SELECT ... FROM,SELECT COUNT(1) FROM并且只返回该数字(非常低效,但仅适用于SQLite PDO).但这还不够好,因为在上面的示例查询中是a GROUP BY,这会改变其含义/功能COUNT(1).
我需要在SQLite数据库中获取列名及其表.我需要的是一个包含2列的结果集:table_name | column_name.
在MySQL中,我能够通过数据库上的SQL查询获取此信息INFORMATION_SCHEMA.但是SQLite提供了表sqlite_master:
sqlite> create table students (id INTEGER, name TEXT);
sqlite> select * from sqlite_master;
table|students|students|2|CREATE TABLE students (id INTEGER, name TEXT)
Run Code Online (Sandbox Code Playgroud)
这导致DDL构造查询(CREATE TABLE)对我没有帮助,我需要解析它以获取相关信息.
我需要获取表的列表并将它们与列连接,或者只获取列和表名列.所以PRAGMA table_info(TABLENAME)不适合我,因为我没有表名.我想获取数据库中的所有列元数据.
有没有更好的方法通过查询数据库来获取结果集的信息?
我的申请给了我这个警告
数据库'+ data + data + com_example_test + database'的SQLiteConnection对象被泄露了!请修复您的应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库.
但是每次使用后我都会关闭db对象和光标.
try {
while (cursor.moveToNext()) {
...
}
} finally {
if (cursor != null && !cursor.isClosed())
cursor.close();
}
...
db.close();
Run Code Online (Sandbox Code Playgroud)
你能帮我理解是什么问题吗?谢谢!!!
UPDATE!虽然一切都关闭了,但 我从这篇帖子中尝试了这个解决方案
我不再有内存泄漏,这是一个很好的解决方案吗?
我们可以使用-cmd选项sqlite3来运行查询,但随后sqlite3打开数据库并在那里等待交互式输入.我们如何从命令行运行查询sqlite3并退出?
谢谢,
我有一个数据库保存在我的应用程序资产文件夹中,并在应用程序首次打开时使用以下代码复制数据库.
inputStream = mContext.getAssets().open(Utils.getDatabaseName());
if(inputStream != null) {
int mFileLength = inputStream.available();
String filePath = mContext.getDatabasePath(Utils.getDatabaseName()).getAbsolutePath();
// Save the downloaded file
output = new FileOutputStream(filePath);
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = inputStream.read(data)) != -1) {
total += count;
if(mFileLength != -1) {
// Publish the progress
publishProgress((int) (total * 100 / mFileLength));
}
output.write(data, 0, count);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行没有问题,但是当你尝试查询数据库时,你会得到一个SQLite:没有这样的表异常.
此问题仅发生在Android P中,所有早期版本的Android都能正常工作.
这是Android P的已知问题还是有些变化?
我有一个经常访问本地sqlite3数据库的android应用程序,出于性能考虑,所以我始终保持连接打开.但我的一位朋友建议我每次操作都要打开/关闭连接.
1)你们对这两种方法的看法是什么?利弊/利弊.2)我做了一些测试,发现数据库连接没有太多的性能开销.DB连接的性能开销是否因DB的大小而异?
sqlite ×10
android ×4
database ×3
python ×2
alter-table ×1
command-line ×1
connection ×1
insert ×1
java ×1
list ×1
pdo ×1
php ×1
shell ×1