- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试从数据库中选择一些数据,我有两段代码可以做到这一点:
cursor = builder.query(db,
new String[]{"col1", "col2", "col3"},
"id = ?", new String[]{getSID(db)}, null, null, null);
和
cursor = builder.query(db,
new String[]{"col1", "col2", "col3"},
"id = " + getSID(db), null, null, null, null);
它们之间的区别在于,根据文档,第一个似乎更正确,但它也不起作用 - 游标为空。而不是第二个 - 我正在获取我需要的所有数据。
所以我尝试使用数据库副本在我的 PC 上执行不同的 SQL 查询,这就是我所得到的:
SELECT col1, col2, col3 FROM SomeTables WHERE (id = '42')
这个不起作用(这个查询显然等于查询,由第一个代码示例生成)
SELECT col1, col2, col3 FROM SomeTables WHERE (id = 42)
这个工作正常(相当于从第二个代码示例中查询)。
据我所知,SQLite 应该会自动执行类型转换,但出了点问题,我不知道为什么。您对如何修复第一个代码示例有任何想法吗? (或者,也许是数据库?)
如果重要的话,这里是带有 id
字段的表的简化 CREATE
脚本:
CREATE TABLE SomeTable ( ID PRIMARY KEY, col1, col2, [...] )
更新:另外,getSID(db) 返回字符串对象。
最佳答案
查询参数只能是字符串是 Android 数据库 API 中一个可怕的设计错误。
不管文档怎么说,你应该只对实际的字符串值使用参数;整数值可以安全地直接嵌入到 SQL 字符串中。 (对于 blob,您必须使用接受 ContentValues
的函数。)
请注意,虽然 SQLite 使用 dynamic typing ,在大多数情况下,不同类型的值不比较相等(SELECT 42='42';
返回0
)。在某些情况下,由于 type affinity,SQLite 确实自动转换值(在您的情况下,如果您将 id
列声明为 INTEGER
,就会发生这种情况),但这是相当违反直觉的,因此不应依赖它。
关于android - SQLiteQueryBuilder 中的 selectionArgs 不适用于列中的整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18013912/
我在 stack overflow 中回答了一个问题,提出这个问题的用户问我: SQlite Query in android using cursor why i must give my sele
我正在尝试创建一个游标加载器,我想在其中查询两个项目的特定列,类似于: SELECT * FROM TABLE_NAME WHERE COLUMN_NAME IN(something, somethi
我正在尝试使用以下内容: String dbquery = "Select * From stops where stopname LIKE '%?%' LIMIT 100"; String[] ui
我有一个包含 BLOB 列的表(它只有 16 个字节)。我想运行 SELECT * FROM myTable WHERE blobColumn = ? 形式的查询并将字节数组绑定(bind)到该列。理
我想使用选择查询从表中检索数据。我发现,SQLiteDatabase 类的 rawQuery(query, selectionArgs) 方法可以检索数据。但是我不知道 query 和 selecti
这个问题已经有答案了: PreparedStatement IN clause alternatives? (33 个回答) 已关闭 8 年前。 我遇到过这个问题: Caused by: java.l
我正在尝试显示特定文件夹中的音频文件。文件夹由用户选择并添加到 arraylist,因此 arraylist 是动态的。现在,当我查询多个文件夹时,mediaStore 不会返回任何结果。我认为问题出
我正在为 RecyclerView.Adapter 使用 Loader 来列出项目。我想列出数据库表中的特定项目。所以我做了: public Loader onCreateLoader(int id,
我有以下内容解析器查询代码: String selection = Columns.NAME + "=? and " + Columns.AVAILABILITY + "=?"; String[] s
我正在尝试从数据库中选择一些数据,我有两段代码可以做到这一点: cursor = builder.query(db, new String[]{"col1",
正如Android文档所说,rawQuery方法的selectionArgs参数被解析为字符串。 SQLiteDatabase.rawQuery(String sql, String[] select
当我在查询中使用 selectionArgs 时,应用程序崩溃日志 12-30 22:22:05.406: ERROR/AndroidRuntime(532): FATAL EXCEPTION: ma
我有如下表格: 同学们: id | student_name ------------------ 1 | max 2 | alex 3 | james 我只想查询 ID
似乎 selectionArgs 没有正确绑定(bind),但我在这里找不到任何错误。 这将返回 2 个结果和那个是正确的 String sql = "SELECT * FROM tblEvent_e
我在 Android 上使用 SQLite。 我使用 ContentProvider 从数据库中查询数据。现在,当我尝试通过 ContentResolver 使用子查询时遇到问题 String sel
在 android 中,如果我像下面这样调用 SQLiteDatabase 方法查询: sqlitedb.query("mytable", null, "name = ?", new Str
如何在 SQLiteDatabase.query() 中使用 String[] selectionArgs?我希望我可以将它设置为 null,因为我没有用它。我只是想将整个未排序的表从数据库加载到 C
我想选择查询以从具有两个条件的一个表中检索数据我的代码是: Cursor res = mDatabase.rawQuery("select * from " + tableName + " where
我正在实现一个 ContentProvider,当我实现查询方法时,我遇到了一些困难。 public final Cursor query (Uri uri, String[] projection,
我在旧设备上使用非官方 API 从 Stock Google Calendar 获取事件。现在我正在重构代码以使用 android.content.ContentResolver.query() 的
我是一名优秀的程序员,十分优秀!