从不在Android SQLite中输入cursor.moveToNext()

从不在Android SQLite中输入cursor.moveToNext(),android,sqlite,select,Android,Sqlite,Select,我正在尝试Android的官方文档。创建数据库、表和插入数据工作正常。但我无法从数据库中获取数据。下面是从表中检索数据的代码段 public Person searchDataInDB(String personCellString) { SQLiteDatabase db = getReadableDatabase(); // Define a projection that specifies which columns from the database // y

我正在尝试Android的官方文档。创建数据库、表和插入数据工作正常。但我无法从数据库中获取数据。下面是从表中检索数据的代码段

public Person searchDataInDB(String personCellString) {
    SQLiteDatabase db = getReadableDatabase();

    // Define a projection that specifies which columns from the database
    // you will actually use after this query.
    String[] projection = {
            PersonTable.COLUMN_NAME_ID,
            PersonTable.COLUMN_NAME_NAME,
            PersonTable.COLUMN_NAME_CELL_NO,
            PersonTable.COLUMN_NAME_ADDRESS
    };

    // Filter results WHERE "cell#" = 'Person Cell #'
    String selection = SQLiteDBHelper.PersonTable.COLUMN_NAME_CELL_NO + " = ?";
    String[] selectionArgs = {"'" + personCellString + "'"};

    // How you want the results sorted in the resulting Cursor
    //  String sortOrder = SQLiteDBHelper.PersonTable.COLUMN_NAME_ID + " DESC";

    Cursor cursor = db.query(
            SQLiteDBHelper.PersonTable.TABLE_NAME,   // The table to query
            null,             // The array of columns to return (pass null to get all)
            selection,              // The columns for the WHERE clause
            selectionArgs,          // The values for the WHERE clause
            null,                   // don't group the rows
            null,                   // don't filter by row groups
            null               // The sort order
    );
    String [] names = cursor.getColumnNames();
    Log.e("SQLiteDB", "cursorCount = " + cursor.getCount() + ", cursorColumnCount = " + cursor.getColumnCount() + ", Column = " + names[0]);

    Person person = null;
    while (cursor.moveToNext()) {
        int id = (int) cursor.getLong(
                cursor.getColumnIndexOrThrow(PersonTable.COLUMN_NAME_ID));
        Log.e("SQLiteDB", "moveToNext id = " + id);
        String name = cursor.getString(
                cursor.getColumnIndexOrThrow(SQLiteDBHelper.PersonTable.COLUMN_NAME_NAME));
        Log.e("SQLiteDB", "moveToNext name = " + name);
        String cellNo = cursor.getString(
                cursor.getColumnIndexOrThrow(SQLiteDBHelper.PersonTable.COLUMN_NAME_CELL_NO));
        Log.e("SQLiteDB", "moveToNext cell = " + cellNo);
        String address = cursor.getString(
                cursor.getColumnIndexOrThrow(SQLiteDBHelper.PersonTable.COLUMN_NAME_ADDRESS));
        Log.e("SQLiteDB", "moveToNext address = " + address);
        person = new Person(id, name, cellNo, address);
    }
    cursor.close();

    return person;
}
我的应用程序似乎没有进入while循环,即
while(cursor.moveToNext()
),因此此方法始终返回person的初始值,该值为null。因此,从代码下面看,第一个条件始终为true

Person person = dbHelper.searchDataInDB(personCellString);
     if (person == null) {
          Toast.makeText(mContext, "no such record exists in database!", Toast.LENGTH_LONG).show();
     } else {
         String personDetails = "Name = " + person.getName()
                  + "Cell Number = " + person.getCellNumber()
                  + "Address = " + person.getAddress();
         personDetailsTV.setText(personDetails);
     }
我正在使用SQLite的DB Browser,以便可以看到记录已成功添加到数据库中


我应该如何处理上述代码才能使其正常工作?

您正在如何处理此代码:

String[] selectionArgs = {"'" + personCellString + "'"};
正在搜索包含在单引号中的
personCellString
的字符串值,而不是字符串
personCellString
的实际值

删除单引号:

String[] selectionArgs = {personCellString};

您不必担心最终sql语句中
personCellString
的字符串表示形式,该语句将被构造和执行,其中将包含它们,而不显式设置它们。

是的,它现在可以工作了。我把它与本机sql查询混淆了,我们必须在其中添加引号:)。谢谢