[英]Why is the assignment of Android cursor from SQLite returning 0 for true
在学习的同时,我正在开发一个Android应用程序,该应用程序访问一个SQLite数据库,该数据库在列中保存了一些布尔数据(以及其他数据),但是我对布尔数据的表示方式感到困惑。
据我了解,出于SQLite的目的,0为false,1为true。 对于我的问题,这是我搜索的结果(有关两个示例,请参见从数据库使用Android和SQLite 获取布尔值和SQLite文档 )。
关于我的特定问题,我正在查询的表具有两个布尔列,并且在所讨论的行中,这两个列在此刻均为“ true”。 但是,当我从应用程序中的这些列中分配值时,它们为“ false”。 这是代码形式的场景;
SQLiteDatabase db = getReadableDatabase();
String[] result_cols = new String[] { KEY, FD_CONTACT_FNAME, FD_CONTACT_SNAME, FD_IS_PUPIL, FD_IS_ACTIVE };
String where = KEY + " = ?";
String whereArgs[] = {id};
String groupBy = null;
String having = null;
String order = null;
Cursor cursor = db.query(DB_TABLE_CONTACTS, result_cols, where, whereArgs, groupBy, having, order);
Log.d("ACONTACT", DatabaseUtils.dumpCursorToString(cursor));
while (cursor.moveToNext()) {
int three = cursor.getInt(3);
int four = cursor.getInt(4);
if (cursor.getInt(3) == 1) {
Log.d("ONE", "1");
} else if (cursor.getInt(3) == 0) {
Log.d("ZERO", "0");
}
Contact mContact = new Contact(cursor.getLong(0), cursor.getString(1), cursor.getString(2), ((cursor.getInt(3) == 1)? true : false), (cursor.getInt(4) > 0));
Log.d("ACONTACT", String.valueOf(mContact.getIsPupil()) + " .... " + String.valueOf(mContact.getIsActive()));
Log.d("ACONTACT", String.valueOf(cursor.getInt(3)) + " .... " + String.valueOf(cursor.getInt(4)));
Log.d("ACONTACT", cursor.getString(1) + " .... " + cursor.getString(2));
Log.d("ACONTACT", String.valueOf(cursor.getLong(0)));
return mContact;
}
代码的日志记录方面导致;
D/ACONTACT: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@418c5f28
0 {
_id=24
fname=Harry
sname=Ballard
is_pupil=true
is_active=true
}
<<<<<
D/ZERO: 0
D/ACONTACT: false .... false
D/ACONTACT: 0 .... 0
D/ACONTACT: Harry .... Ballard
D/ACONTACT: 24
“联系人”是一个自定义类,没有什么复杂的,它具有类似的构造函数;
public Contact( long id, String fname, String sname, Boolean isPupil, Boolean isActive ) {
this.id = id;
this.fname = fname ;
this.sname = sname ;
this.isPupil = isPupil;
this.isActive = isActive;
}
从日志记录中我可以看到,当游标被“ DatabaseUtils”转储时,游标是正确的,但是当我将游标值读入我的类或任何其他用于调试的变量时,它们显示为错误(int'three'和int例如,“四”保持零,因此赋值后为假)。 其他三列中的数据始终正确。
我显然丢失了一些东西,但是正如我看到的那样,游标保存了正确的数据(两个布尔列,都具有'true'值,如游标转储所示),然后是cursor.getInt(3)和cursor.getInt( 4)两者都返回零,即false。 光标看起来如何改变,它正在:)
说了这么多,我的标题可能不正确,因为光标最初是正确的,但随后出了点问题。 有人对什么有任何线索吗?
当文档中说“布尔值存储为整数0(false)和1(true)”时,这恰恰意味着:您必须将它们存储为数字0
和1
。
目前,您正在将字符串 true
或false
存储在数据库中。 这些值不能转换为整数。
好的,我很抱歉听到这个声音。 使用文字值“ true”和“ false”将布尔数据插入数据库中。 因此,使用整数逻辑('cursor.getInt(0)> 0'或等效值)来确定true或false总是返回false,因为所保存的值实际上是'true'而不是'1'。
我希望这很清楚。 再次,对噪声表示歉意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.