Tomé un ejemplo para trabajar con SQLite en Android desde aquí: http://www.cnblogs.com/pangblog/p/3327696.html

Y yo strugle con la obtención de contacto por su nombre. ¿Cómo puedo cambiar GetContact función de búsqueda por nombre?

DatabaseHandler:

public class DatabaseHandler extends SQLiteOpenHelper {
//Database Version 
private static final int DATABASE_VERSION = 1;
//Database Name
private static final String DATABASE_NAME = "contactsManager";
//Contacts table name 
private static final String TABLE_CONTACTS = "contacts";
//Contacts Table Columns names 
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_PH_NUM = "phone_number";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Creating Tables : CREATE TABLE table_name (column_name column_type);
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_PH_NUM + " TEXT" + ")";       
db.execSQL(CREATE_CONTACTS_TABLE);
}
// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed 
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
// Create tables again
onCreate(db);
}   
//Adding new contact 
void addContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName()); // Contact Name
values.put(KEY_PH_NUM, contact.getPhoneNumber()); // Contact Phone
// Inserting Row
db.insert(TABLE_CONTACTS, null, values);
db.close(); // Closing database connection
}
// Getting single contact 
Contact getContact(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME, KEY_PH_NUM }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
return contact;
}
// Getting All Contacts
public List<Contact> getAllContacts() {
List<Contact> contactList = new ArrayList<Contact>();
// Select All Query SELECT * FROM tableName WHERE criteria
String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact();
contact.setID(Integer.parseInt(cursor.getString(0)));
contact.setName(cursor.getString(1));
contact.setPhoneNumber(cursor.getString(2));
// Adding contact to list
contactList.add(contact);
} while (cursor.moveToNext());
}
return contactList;
}
}

Contacto:

public class Contact {
int _id;
String _name;
String _phone_number;
public Contact() {
}
public Contact(int id, String name, String phone_number) {
this._id = id;
this._name = name;
this._phone_number = phone_number;
}
public Contact(String name, String phone_number) {
this._name = name;
this._phone_number = phone_number;
}
public int getID() {
return this._id;
}
public void setID(int id) {
this._id = id;
}
public String getName() {
return this._name;
}
public void setName(String name) {
this._name = name;
}
public String getPhoneNumber() {
return this._phone_number;
}
public void setPhoneNumber(String phone_number) {
this._phone_number = phone_number;
}
}
  • Cuando usted dice «por el nombre de» ¿qué significa realmente ? Qué pase el nombre de un contacto para la función y la encuentra en la tabla ?
InformationsquelleAutor Dim | 2013-09-18

4 Comentarios

  1. 5

    La cláusula where en la consulta de base de datos en getContact es actualmente id = ? y la ? es reemplazado con el parámetro id. Lo que usted necesita hacer para buscar por el nombre es modificar esa parte.

    // Getting single contact 
    Contact getContact(String name) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
    KEY_NAME, KEY_PH_NUM }, KEY_NAME + "=?",
    new String[] { name }, null, null, null, null);
    //...

    También debe cambiar el «trabajo» código un poco, ya que no es realmente seguro. Un cursor no puede ser null (en la práctica), pero cursor.moveToFirst() puede fallar si no hay tal nombre en la base de datos. Si no, usted recibirá una excepción en cursor.getString(0) debido a que el cursor no tiene ninguna fila para obtener datos de.

    Caída de la null de verificación, y revise si el cursor puede ser movido a la primera posición (no vacío). También debe cerrar el cursor una vez que no la necesito.

    Contact contact = null;
    if (cursor.moveToFirst()) {
    contact = new Contact(Integer.parseInt(cursor.getString(0)),
    cursor.getString(1), cursor.getString(2));
    }
    cursor.close();
    // can return null if no contact was found.
    return contact;
    • ¿qué acerca de multi cláusula where? tales como:Select * donde num=’10’ tipo=’oro’
  2. 2

    http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.Cadena)

    uso de la documentación.

    hacer

    db.query(TABLE_CONTACTS, new String[] { KEY_ID,
    KEY_NAME, KEY_PH_NUM }, KEY_NAME+ "=?",
    new String[] { String.valueOf(NAME) }, null, null, null, null);

    y Empuje el NOMBRE de la variable en la cabeza de la función.

  3. 0

    Puede buscar por código siguiente en SQLite;

    En MainActivity;

     search.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapter.getFilter().filter(s.toString());
    }
    });
    adapter.setFilterQueryProvider(new FilterQueryProvider() {
    public Cursor runQuery(CharSequence constraint) {
    return 
    //Here you can filter data by any row , just change text replace of "subject"
    dbManager.fetchdatabyfilter(constraint.toString(),"subject");
    }
    });

    DatabaseHelper.java

     public Cursor fetchdatabyfilter(String inputText,String filtercolumn) throws SQLException {
    Cursor row = null;
    String query = "SELECT * FROM "+DatabaseHelper.TABLE_NAME;
    if (inputText == null  ||  inputText.length () == 0)  {
    row = database.rawQuery(query, null);
    }else {
    query = "SELECT * FROM "+DatabaseHelper.TABLE_NAME+" WHERE "+filtercolumn+" like '%"+inputText+"%'";
    row = database.rawQuery(query, null);
    }
    if (row != null) {
    row.moveToFirst();
    }
    return row;
    }
  4. 0

    JS:

       EditText et = (EditText) findViewById(R.id.myFilter);
    et.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapter.getFilter().filter(s.toString());
    }
    });
    adapter.setFilterQueryProvider(new FilterQueryProvider() {
    public Cursor runQuery(CharSequence constraint) {
    return db.fetchdatabyfilter(constraint.toString(),"name" );
    }
    });

    • puede usted explicar cómo se te ocurrió con esta solución?
    • acabo de completar el código para la búsqueda por nombre y ahora estoy tratando de nombre y contacto de ambos con taxtwatcher
    • El setFilterQueryProvider sólo funciona con CursorAdapter y SimpleCursorAdapter!

Dejar respuesta

Please enter your comment!
Please enter your name here