我是android开发的初学者,如果这很明显,请原谅。我制作了一个基本的用户管理系统来练习数据库连接。由于该段,我的注册活动崩溃了。
if(Db.getUser(Uid) != null){ //Db is a DatabaseHandler Object
Toast.makeText(getApplicationContext(),"Email is Already Used",Toast.LENGTH_SHORT);
Proceed = false;
}
这是DatabaseHandler.getUser()
User getUser(String Uid) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_UID,
KEY_NAME, KEY_PASS }, KEY_UID + "=?",
new String[] { Uid }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
else
return null; //I explicitly made this statement to return null in case of no match
User user = new User(cursor.getString(0),cursor.getString(1), cursor.getString(2));
// return User
return user;
}
我经常使用django,因此我认为android SQLite还返回了类似于空白QuerySet的内容。我错了吗?它会引发异常吗?如果是这样,什么是我要达到的最佳实施方式?
答案 0 :(得分:2)
SQLite还返回了类似于空白QuerySet的内容。我错了吗?
查询方法返回一个游标。可能被描述为空白(为空,Cursor的getCount方法将返回0,即没有提取的数据),但不是 null 。
它会引发异常吗?
如果在光标位于第一行之前的 (初始位置)或最后一行之后的 / em> ,那么您将获得一个例外。也就是说,仅当游标位于现有行上时,您才能读取数据。
简而言之,您的问题是您没有检查行是否存在,因为Cursor不会为空。
query 方法返回一个游标,该游标将保存许多行,每个行都由查询中指定的列组成。
从 query 方法返回的Cursor永远不会为null(因此检查null不会执行任何操作(您的第一个问题))。但是,光标可能为空。因此,您需要处理这种情况。
要检查游标是否返回了任何行,您可以使用游标的 getCount 方法来检查行数,例如if (cursor.getCount() > 0) { ... get data from row .. } else { ... handle no rows ... }
或者,许多Cursor的move?????
方法返回一个布尔值,如果可以移动,则返回true,否则返回false。例如if (moveToFirst()) { ... get data from row .. } else { ... handle no rows ... }
。
您可以使用while(cursor.moveToNext(){...从当前行获取数据..};
如果是这样,那么我要达到的最佳实现是什么?
这样,在您的代码中,您想要获得一行并构建并返回一个User(应该只有一行与Uid相匹配(假设该列是用UNIQIUE约束显式或隐式定义的))是:-
User getUser(String Uid) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_UID,
KEY_NAME, KEY_PASS }, KEY_UID + "=?",
new String[] { Uid }, null, null, null, null);
if (cursor.moveToFirst()) {
return new User(cursor.getString(csr.getColumnIndex(KEY_UID),cursor.getString(cursor.getColumnIndex(KEY_NAME)),cursor.getString(cursor.getColumnIndex(KEY_PASS));
} else
return null; //I explicitly made this statement to return null in case of no User
}
请注意,使用getColumnIndex(the_column_name)可以减少确定列偏移量时发生错误的可能性,例如
如果您无意中使用了db.query(TABLE_CONTACTS, new String[] { KEY_UID, KEY_PASS, KEY_NAME }, KEY_UID + "=?", new String[] { Uid }, null, null, null, null);
,则如果使用硬编码的偏移量,则结果User将以密码作为名称,并以名称作为密码。使用getColumnIndex时,游标中列的位置无关紧要。
请注意,以上代码为原则代码,尚未经过测试或运行,因此可能有错误。