- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否可以在 moveToNext() 之前调用 getType() 和 getColumnNames()。
基本上,我正在尝试编写以下辅助函数:
public static int getColumnIndex(Cursor c, String columnName) {
for (int i = 0; i < c.getColumnNames().length; i++) {
String realName = c.getColumnName(i);
if (realName.substring(realName.indexOf(".") + 1).equals(columnName)) {
return i;
}
}
return -1;
}
public static Object getSQLValue(Cursor c, String columnName) {
int index = getColumnIndex(c, columnName);
if (index > -1) {
switch (c.getType(index)) {
case Cursor.FIELD_TYPE_BLOB:
return c.getBlob(index);
case Cursor.FIELD_TYPE_FLOAT:
return c.getFloat(index);
case Cursor.FIELD_TYPE_STRING:
return c.getString(index);
case Cursor.FIELD_TYPE_INTEGER:
return c.getInt(index);
case Cursor.FIELD_TYPE_NULL:
return null;
}
}
return null;
}
但有时我在 c.getType(index) 处遇到错误(来自未与我共享数据库的 beta 测试人员...),其中索引为 0,c 的大小为 0:
Caused by android.database.CursorIndexOutOfBoundsException
Index 0 requested, with a size of 0
既然 getColumnIndex 应该在出现问题时返回 -1,那么 getColumnIndex 如何返回 0 并且同时 c 在索引 0 处没有列?难道是因为在此之前没有调用“moveToNext()”吗?
谢谢。
最佳答案
简而言之,除非您移动到有效行并且另外要求游标本身具有行,否则您无法获取列类型。
因此你需要
检查 Cursor 实际上有 1 行或多行(即它不为空)。返回 int 的 Cursor getCount()
方法可用于此目的。
移动到一个有效的行并为正确移动回到光标之前定位到的行。
因此,我相信以下将是您想要的:-
public static Object getSQLValue(Cursor c, String columnName) {
Log.d("CURSORCOUNT","Cursor has a size of " + String.valueOf(c.getCount())); //<<<<<<<<<< for demo //TODO remove me
Object rv = null;
int rowcount = c.getCount();
if (rowcount < 1) {
return rv;
}
int index = getColumnIndex(c, columnName);
int pos = c.getPosition();
boolean moveback = false;
if (pos < 0 || pos >= rowcount) {
c.moveToFirst();
moveback = true;
}
if (index > -1) {
switch (c.getType(index)) {
case Cursor.FIELD_TYPE_BLOB:
rv = c.getBlob(index);
break;
case Cursor.FIELD_TYPE_FLOAT:
rv = c.getFloat(index);
break;
case Cursor.FIELD_TYPE_STRING:
rv = c.getString(index);
break;
case Cursor.FIELD_TYPE_INTEGER:
rv = c.getInt(index);
break;
}
}
if(moveback) c.moveToPosition(pos);
return rv;
}
假设数据库有一个表和一个具有 bool 参数的 getRows 方法 - 如果为 false,则通过游标检索表中的所有行 - 如果为真,则返回一个空的 Cursor
使用以下测试:-
public class MainActivity extends AppCompatActivity {
DBHelper mDBHlpr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDBHlpr = new DBHelper(this); //<<<<<<<<<< The Database Helper
mDBHlpr.getWritableDatabase().delete(DBHelper.TBL_MYTABLE,null,null); //<<<<<<<<<< empty table
// Add some testing data
mDBHlpr.insert("2019-03-25T19:19:39.664Z");
mDBHlpr.insert("\"2019-03-25T19:19:39.664Z\"");
// Get a populated cursor (c1) and and empty cursor (c2)
Cursor c1 = mDBHlpr.getRows(false); //<<<<<<<<<< populated
Cursor c2 = mDBHlpr.getRows(true); //<<<<<<<<< empty
Cursor c3 = mDBHlpr.getRows(false); //<<<<<<<<<< populated for position preservation example
c3.moveToPosition(1); //<<<<<<<<<< moved to 2nd row
// Try with a non-existant column for the populated cursor
logit(DBHelper.getSQLValue(c1,"NOTACOLUMN"),"TEST1 - NOT A COLUMN");
// Try with a valid column for the populated cursor
logit(DBHelper.getSQLValue(c1,DBHelper.COL_MYTABLE_MYSTRING),"TEST2 - VALID COLUMN");
// Try with a non-existant column for the empty cursor
logit(DBHelper.getSQLValue(c2,"NOTACOLUMN"),"TEST3 - NOT A COLUMN - EMPTY CURSOR");
// Try with a valid column for the empty cursor
logit(DBHelper.getSQLValue(c2,DBHelper.COL_MYTABLE_MYSTRING),"TEST4 - VALID COLUMN - EMPTY CURSOR");
//PRESERVATION OF POSITION EXAMPLE
// Try with a valid column for the populated cursor
logit(DBHelper.getSQLValue(c3,DBHelper.COL_MYTABLE_MYSTRING),"TEST2 - VALID COLUMN");
Log.d("PRESERVED_POS", "Position is " + String.valueOf(c3.getPosition()));
}
private void logit(Object o,String tag) {
String msg = "OBJECT IS NULL!!!!";
if (o != null) {
msg = "OBJECT IS " + o.toString();
}
Log.d(tag,msg);
}
}
03-23 13:19:36.175 20570-20570/? D/CURSORCOUNT: Cursor has a size of 2
03-23 13:19:36.176 20570-20570/? D/TEST1 - NOT A COLUMN: OBJECT IS NULL!!!!
03-23 13:19:36.176 20570-20570/? D/CURSORCOUNT: Cursor has a size of 2
03-23 13:19:36.176 20570-20570/? D/TEST2 - VALID COLUMN: OBJECT IS 2019-03-25T19:19:39.664Z
03-23 13:19:36.176 20570-20570/? D/CURSORCOUNT: Cursor has a size of 0
03-23 13:19:36.176 20570-20570/? D/TEST3 - NOT A COLUMN - EMPTY CURSOR: OBJECT IS NULL!!!!
03-23 13:19:36.176 20570-20570/? D/CURSORCOUNT: Cursor has a size of 0
03-23 13:19:36.176 20570-20570/? D/TEST4 - VALID COLUMN - EMPTY CURSOR: OBJECT IS NULL!!!!
03-23 13:19:36.176 20570-20570/? D/CURSORCOUNT: Cursor has a size of 2
03-23 13:19:36.176 20570-20570/? D/TEST2 - VALID COLUMN: OBJECT IS "2019-03-25T19:19:39.664Z"
03-23 13:19:36.176 20570-20570/? D/PRESERVED_POS: Position is 1
注意,每个不同的行/列组合都可以有自己的类型,除了 rowid 列或其别名(值只能是一个此类列的整数),任何类型的值都可以存储在任何类型的列中。
注意 getInt 可能无法正确检索所有值,因为 INTEGER 的列类型可以存储 64 位有符号值,因此在某些实例可能需要 getLong 才能获取有效值。同样,可能需要 getDouble 而不是 getFloat 来防止精度损失。
关于android - 在 Android 中 moveToNext() 失败之前对 getType() 和 getColumnNames() 的 SQL 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55307158/
我正在寻找一种使此打印 HTML 代码 fragment 向后兼容旧 Android 版本的简单方法: @TargetApi(Build.VERSION_CODES.KITKAT) private v
我在 GCC 终端 (centos linux) 中为 ATM 项目编译以下 c 和 .h 代码时收到以下错误。请帮忙,因为我是编程新手。 validate_acc.h #ifndef _VALIDA
在写关于 SO 的不同问题的答案时,我制作了这个片段: @import url('https://fonts.googleapis.com/css?family=Shadows+Into+Light'
试图弄清楚我应该如何在 my_div_class 之前放置一个 span 而不是替换所有它。现在它取代了 div,但我不想这样做。我假设它类似于 :before 但不知道如何使用它。 { va
我正在使用选择库 http://github.hubspot.com/select/和 noUiSlider https://refreshless.com/nouislider/ .我面临的问题如下
我是开发新手,独自工作。我正在使用 Xcode 和 git 版本控制。可能我没有适本地组织和做错事,但我通常决定做 promise 只是为了在我破坏一切之前做出安全点。在那一刻,我发现很难恰本地描述我
我想确保在同一个桶和键上读取和写入时,应该更新获取的值,也就是说,应该在对其进行写入操作之后获取它。我怎样才能做到这一点? 我想要的是,如果我更新一个键的值,如果我同时使用不同线程获取值,则更新同一个
我的问题与this有关问题,已经有了答案: yes, there is a happens-before relationship imposed between actionsof the thre
The before and after hook documentation on Relish仅显示 before(:suite) 在 before(:all) 之前调用。 我什么时候应该使用其中
我有 CSV 行,我想在其中检测所有内部双引号,没有文本限定符。这几乎可以正常工作,但我的正则表达式还可以检测双引号后的字符。 CSV 部分: "7580";"Lorem ipsum";"";"Lor
是否可以通过Youtube数据API检查广告是否可以与特定视频一起显示? 我了解contentDetails.licensedContent仅显示视频是否已上传至同一伙伴然后由其声明版权。由于第三者权
考虑一下用漂亮的彩色图表描述的“像素管道” https://developers.google.com/web/fundamentals/performance/rendering/ 我有一个元素(比
之前?
在 MVC3 中,我可以轻松地将 jQuery 脚本标签移动到页面底部“_Layout.vbhtml” 但是,在 ASP.NET MVC3 中,当您使用编辑器模板创建 Controller 时,脚手
悬停时内容被替换,但是当鼠标离开元素时我希望它变回来。我该怎么做? $('.img-wrap').hover(function(){ $(this).find('h4').text('Go
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。
版本:qwt 6.0.1我尝试开发频谱的对数缩放。我使用简单的线条来启用缩放plotspectrum->setAxisScaleEngine(QwtPlot::yLeft, new QwtLog10S
我有两个相同的表,I_Subject 和 I_Temp_Subject,我想将 Temp_Subject 表复制到 Subject 表。 I_Temp_Subject 由简单用户使用,I_Subjec
我的印象是第一次绘制发生在触发 DOMContentLoaded 事件之后。特别是,因为我认为为了让第一次绘制发生,需要渲染树,它依赖于 DOM 构造。另外,我知道 DOM 构造完成时会触发 DOMC
我是一名优秀的程序员,十分优秀!