简体   繁体   English

Android SQLite按名称搜索

[英]Android SQLite search by name

I took an example for working with SQLite in Android from here: http://www.cnblogs.com/pangblog/p/3327696.html 我从这里开始使用Android中的SQLite示例: http//www.cnblogs.com/pangblog/p/3327696.html

And I strugle with getting contact by name. 我唠叨着通过名字联系。 How can I change GetContact function to search by name? 如何更改GetContact函数以按名称搜索?

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;
    }


}

Contact: 联系:

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;
    }


}

The where clause in the database query in getContact is currently id = ? getContact中数据库查询中的where子句当前是id = ? and the ? ? is replaced with the id parameter. 被id参数替换。 What you need to do to search by the name is to modify that part. 按名称搜索需要做的是修改该部分。

// 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);
    //...

You should also change the "working" code a bit since it's not really safe. 您还应该更改“工作”代码,因为它不是很安全。 A cursor can't be null (in practice) but cursor.moveToFirst() can / will fail if there is no such name in the database. 游标不能为null (实际上),但如果数据库中没有这样的名称, cursor.moveToFirst()可能会失败。 If it fails you will get an exception at cursor.getString(0) because the cursor has no row to get data from. 如果失败,您将在cursor.getString(0)处获得异常,因为游标没有行来从中获取数据。

Drop the null check, and do check whether cursor could be moved to the first position (is not empty). 删除null检查,并检查光标是否可以移动到第一个位置(不为空)。 You should also close the cursor once you don't need it anymore. 一旦不再需要它,你也应该关闭光标。

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;

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.String) 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.String)

use documentation. 使用文档。

make 使

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

and Push variable NAME in the head of function. 并在函数头部推送变量NAME。

You can search by following code in SQLite; 您可以在SQLite中按照以下代码进行搜索;

In MainActivity; 在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 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;
}

  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" ); } }); 

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

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