Как отобразить данные из hashmap в Android? - PullRequest
0 голосов
/ 04 марта 2012

У меня есть хэш-карта, которую я хотел бы отобразить. Пользователь вводит имя в editText, и когда он нажимает кнопку поиска, он должен пройти через хэш-карту и показать запись, которая соответствует тексту в тексте редактирования с ключом.

HashMap<String, Staff> h = new HashMap<String, Staff>();
Staff staff = new Staff("Thomas", "133", "thomas133@email.com");
h.put("Thomsas", staff);

Я попытался адаптировать приложение блокнота

package android;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.project.R;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;

public class SingleStaff extends ListActivity {
private DBAdapter mDbHelper;
private EditText staffName;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.searchstaff);
    staffName = (EditText) findViewById(R.id.staffname);
    mDbHelper = new DBAdapter(this);
    mDbHelper.open();
    registerForContextMenu(getListView());

    Button search = (Button) findViewById(R.id.confirm);
    search.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) 
        {
            String a = staffName.getText().toString();
            fillData(a);          
        }
    });

}

 private void fillData(String staffName) {
        Cursor notesCursor = mDbHelper.fetchSingleStaff(staffName);
        startManagingCursor(notesCursor);

        // Create an array to specify the fields we want to display in the list (only TITLE)
        String[] from = new String[]{ DBAdapter.STAFF_NAME, DBAdapter.STAFF_ROOM, DBAdapter.STAFF_EMAIL};

        // and an array of the fields we want to bind those fields to (in this case just text1)
        int[] to = new int[]{R.id.text1, R.id.text2, R.id.text3};

        // Now create a simple cursor adapter and set it to display
        SimpleCursorAdapter notes = 
            new SimpleCursorAdapter(this, R.layout.note_row_staff, notesCursor, from, to);
        setListAdapter(notes);
    }

}

Когда я запускаю приложение и набираю, например, «Thomas» в тексте редактирования и нажимаю кнопку «Поиск», я получаю сообщение об ошибке,

android.database.sqlite.SQLiteException: no such column: Thomas: , while compiling: SELECT     
DISTINCT _id, name, room, email FROM staff WHERE name=Thomas

1 Ответ

0 голосов
/ 04 марта 2012

Вы можете изменить строку запроса на (обратите внимание на одинарную кавычку вокруг staffName:

Cursor mCursor = mDb.query(true, STAFF_TABLE, new String[] {STAFF_ROWID, STAFF_NAME, STAFF_ROOM, STAFF_EMAIL}, STAFF_NAME + "='" + staffName + "'", null, null, null, null, null);

Лучше использовать ? заполнители, чтобы избежать подобных проблем (не проверено)

public Cursor fetchSingleStaff(String staffName) throws SQLException {
    String[] arg = new String[] { staffName }; 
    Cursor mCursor = mDb.query(true, STAFF_TABLE, new String[] {STAFF_ROWID, STAFF_NAME, STAFF_ROOM, STAFF_EMAIL}, STAFF_NAME + "=?", arg , null, null, null, null); 
    if (mCursor != null) { 
        mCursor.moveToFirst(); 
    } 
    return mCursor; 
}

Если вы хотите использовать карту, вы можете перегрузить вышеуказанный метод и установить staffName с соответствующим значением на вашей карте

public Cursor fetchSingleStaff(Map<String, Staff> m) throws SQLException {
    return fetchSingleStaff(m.getFirstName); // m.getFirstName() should be mapped the `Thomas` in `Staff` - Update according to your implementation
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...