繁体   English   中英

为什么从SQLite分配Android游标会为true返回0

[英]Why is the assignment of Android cursor from SQLite returning 0 for true

在学习的同时,我正在开发一个Android应用程序,该应用程序访问一个SQLite数据库,该数据库在列中保存了一些布尔数据(以及其他数据),但是我对布尔数据的表示方式感到困惑。

据我了解,出于SQLite的目的,0为false,1为true。 对于我的问题,这是我搜索的结果(有关两个示例,请参见从数据库使用AndroidSQLite 获取布尔值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)”时,这恰恰意味着:您必须将它们存储为数字01

目前,您正在将字符串 truefalse存储在数据库中。 这些值不能转换为整数。

好的,我很抱歉听到这个声音。 使用文字值“ true”和“ false”将布尔数据插入数据库中。 因此,使用整数逻辑('cursor.getInt(0)> 0'或等效值)来确定true或false总是返回false,因为所保存的值实际上是'true'而不是'1'。

我希望这很清楚。 再次,对噪声表示歉意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM